Кад да ... в mySQL
13 отговора
716 прегледа
Кад да ... в mySQL
Здравейте,
Искам да направя един селект, но в една от колоните да mySQL да ми подава номера на реда.
Пример: select id,name,?num? as num from table;
id, name, num
-----------------
1 name 1
7 namme 2
22 name22 3
....
10x
Искам да направя един селект, но в една от колоните да mySQL да ми подава номера на реда.
Пример: select id,name,?num? as num from table;
id, name, num
-----------------
1 name 1
7 namme 2
22 name22 3
....
10x
Re: Кад да ... в mySQL
Ми слагаш си в таблизата autoincrement....
Bеer? Mоre?
Плацебото
Bеer? Mоre?
Плацебото
Re: Кад да ... в mySQL
не става въпрос за INSERT, а за SELECT
искам mySQL да ми връща номера на реда ... ако сложа уникално ID (AUTOINCREMENT), това не ми е гаранция, че IDто ще ми е поредно, да не говорим, че SELECT-a може да не е подреден по ID...
Под номер на ред искам да кажа, примерно ако направя select ... LIMIT 0,10
първия ред да има: num=1, втория num=2, третия num=3
Съгласен съм, че това може да се изведе в скрипта извън MySQL примерно с PHP да си показвам номера на реда, но искам да направя оптимизация и ми трябва вариянт директно от MySQL да идва стойността....
благодаря ви предварително
искам mySQL да ми връща номера на реда ... ако сложа уникално ID (AUTOINCREMENT), това не ми е гаранция, че IDто ще ми е поредно, да не говорим, че SELECT-a може да не е подреден по ID...
Под номер на ред искам да кажа, примерно ако направя select ... LIMIT 0,10
първия ред да има: num=1, втория num=2, третия num=3
Съгласен съм, че това може да се изведе в скрипта извън MySQL примерно с PHP да си показвам номера на реда, но искам да направя оптимизация и ми трябва вариянт директно от MySQL да идва стойността....
благодаря ви предварително
Не съм гуру ама си мисля
че дори да намериш начин да ползваш номера на реда, е кофти номер.
БД са направени да ти връщат каквото искаш, без значение как се пази, или съхранява.
Без значение на коя част на диска.....
Bеer? Mоre?
Плацебото
БД са направени да ти връщат каквото искаш, без значение как се пази, или съхранява.
Без значение на коя част на диска.....
Bеer? Mоre?
Плацебото
Re: Такова живитно нема ...
Няма "номер на ред" в Релационния модел.
Таблиците са дефинирани като неподредени множества т.е. сървърът е в правото си да ги съхранява и показва в произволен ред. Произволен = какъвто намери за добре а не непременно случаен.
Ако нямаш ORDER BY клауза една и съща заявка изпълнена няколко пъти може да ти връща резултата всеки път в различна подредба.
Колкото до "номера на реда от резултата" това винаги е най-лесно да се прави в клиентската част. Просто така или иначе въртиш някакаъв цикъл за да обработиш редовете (дори и ако "обработката" се състои от единствен print()), а като въртиш цикъл какво по просто от това да сложиш и брояч
salle.online.bg/sig
Таблиците са дефинирани като неподредени множества т.е. сървърът е в правото си да ги съхранява и показва в произволен ред. Произволен = какъвто намери за добре а не непременно случаен.
Ако нямаш ORDER BY клауза една и съща заявка изпълнена няколко пъти може да ти връща резултата всеки път в различна подредба.
Колкото до "номера на реда от резултата" това винаги е най-лесно да се прави в клиентската част. Просто така или иначе въртиш някакаъв цикъл за да обработиш редовете (дори и ако "обработката" се състои от единствен print()), а като въртиш цикъл какво по просто от това да сложиш и брояч
salle.online.bg/sig
Re: така
10x a lot
Точно това търсех:
set @x := 0;
SELECT @x := @x+1 as num,ID, NAME FROM test;
Върши чудесна работа. Сега разбира се, се опитвам да го направя да е само в едно query
set @x := 0;
SELECT IF(@x iS NULL,@x := 0,1) as xx,@x := @x+1 as num,ID, NAME FROM test;
но нещо не се получава.... винаги IF връща, че @x е NULL...
пробвах и с SELECT CASE THEN още по голям мармалад :-)
ако някой измисли някоя брилянтна идея да пише! -:)
Поздрави
Точно това търсех:
set @x := 0;
SELECT @x := @x+1 as num,ID, NAME FROM test;
Върши чудесна работа. Сега разбира се, се опитвам да го направя да е само в едно query
set @x := 0;
SELECT IF(@x iS NULL,@x := 0,1) as xx,@x := @x+1 as num,ID, NAME FROM test;
но нещо не се получава.... винаги IF връща, че @x е NULL...
пробвах и с SELECT CASE THEN още по голям мармалад :-)
ако някой измисли някоя брилянтна идея да пише! -:)
Поздрави
Re: така
10x a lot
Точно това търсех:
set @x := 0;
SELECT @x := @x+1 as num,ID, NAME FROM test;
Върши чудесна работа. Сега разбира се, се опитвам да го направя да е само в едно query
SELECT IF(@x iS NULL,@x := 0,1) as xx,@x := @x+1 as num,ID, NAME FROM test;
но нещо не се получава.... винаги IF връща, че @x е NULL...
пробвах и с SELECT CASE THEN още по голям мармалад :-)
ако някой измисли някоя брилянтна идея да пише! -:)
Поздрави
Точно това търсех:
set @x := 0;
SELECT @x := @x+1 as num,ID, NAME FROM test;
Върши чудесна работа. Сега разбира се, се опитвам да го направя да е само в едно query
SELECT IF(@x iS NULL,@x := 0,1) as xx,@x := @x+1 as num,ID, NAME FROM test;
но нещо не се получава.... винаги IF връща, че @x е NULL...
пробвах и с SELECT CASE THEN още по голям мармалад :-)
ако някой измисли някоя брилянтна идея да пише! -:)
Поздрави
Re: Такова живитно нема ...
salle,
Ясно е, че може да се направи извън mySQL....
Въпроса е принципен, ако не ме разбираш ..... :-) не коментирай..... и въобще защо ги даваш тези обяснения не мога да разбера, никой не пита за ORDER на записите и т.н.
ето такава заявка си търсех
set @x := 0;
SELECT @x := @x+1 as num,ID, NAME FROM test;
Поздрави
Ясно е, че може да се направи извън mySQL....
Въпроса е принципен, ако не ме разбираш ..... :-) не коментирай..... и въобще защо ги даваш тези обяснения не мога да разбера, никой не пита за ORDER на записите и т.н.
ето такава заявка си търсех
set @x := 0;
SELECT @x := @x+1 as num,ID, NAME FROM test;
Поздрави
Re: За да те разберат ...
... трабва да обясниш какво имаш предвид.
Като кажеш:
"но в една от колоните да mySQL да ми подава номера на реда."
"номера на реда" може да се тълкува по различни начини.
А като ти е толкова ясно, че може да се направи в от страната на клиента защо въобще питаш?
Какъв е смисъла да товариш сървъра и връзката между сървъра и клиента с напълно излишна информация?
salle.online.bg/sig
Като кажеш:
"но в една от колоните да mySQL да ми подава номера на реда."
"номера на реда" може да се тълкува по различни начини.
А като ти е толкова ясно, че може да се направи в от страната на клиента защо въобще питаш?
Какъв е смисъла да товариш сървъра и връзката между сървъра и клиента с напълно излишна информация?
salle.online.bg/sig
Re: За да те разберат ...
Въпроса е принципен, не е жизненоважен....
Така като гледам не само аз се интересувам!
Всички останали са ме разбрали какво питам!
`Номер на ред` означава номер на ред, а не autoincrement pole или каквото там друго може да Ви хрумне!!!
Благодаря още веднъж на всички за отделеното време. Ще се радвам ако
някой гений успее да намери начин за извличане на пореден номер на ред с едно кюери.
Поздрави
Така като гледам не само аз се интересувам!
Всички останали са ме разбрали какво питам!
`Номер на ред` означава номер на ред, а не autoincrement pole или каквото там друго може да Ви хрумне!!!
Благодаря още веднъж на всички за отделеното време. Ще се радвам ако
някой гений успее да намери начин за извличане на пореден номер на ред с едно кюери.
Поздрави
Re: От какво?
"`Номер на ред` означава номер на ред"
"Номер на ред от резултата от заявката" е нещо страшно различно от "номер на ред от таблицата от която взимаш данните".
А това от твоя въпрос не стана ясно та трябваше да гадаем какво може би си имал предвид.
Колкото до "останалите" те бяха общо двама и от тях само 50% отгатнаха гатанката. Като прибавим и мен Dakota се оказва малцинство с 33%
Това в рамките на заяждането естествено.
Аз пък ще се радвам ако отговориш на въпроса за какво ти е изобщо това?
Спомена някаква оптимизация, но тя чак пък толкова ли е секретна, че да не можеш да я споделиш? Може пък на някой друг да му е от полза или пък да доразвие идеята ти и да ти я върне.
salle.online.bg/sig
"Номер на ред от резултата от заявката" е нещо страшно различно от "номер на ред от таблицата от която взимаш данните".
А това от твоя въпрос не стана ясно та трябваше да гадаем какво може би си имал предвид.
Колкото до "останалите" те бяха общо двама и от тях само 50% отгатнаха гатанката. Като прибавим и мен Dakota се оказва малцинство с 33%
Това в рамките на заяждането естествено.
Аз пък ще се радвам ако отговориш на въпроса за какво ти е изобщо това?
Спомена някаква оптимизация, но тя чак пък толкова ли е секретна, че да не можеш да я споделиш? Може пък на някой друг да му е от полза или пък да доразвие идеята ти и да ти я върне.
salle.online.bg/sig
Re: От какво?
Обяснението ми е ОК, че и пример съм дал....... само да има кой да прочете внимателно! - що се отнася до заяждането
а, за какво ми е.... ето подробно 100 процентово обяснение ;-)
Правя си собствена функция за replace на ключови думи и показване на данни взети от таблица. Ето как може да изглежда стринга в файла:
(file) design.des.php: "#nom#. #name#"
Стринга се повтаря толкова пъти колкото реда са селекнати от таблицата. Така поставени нещата функцията за replace изглежда така:
function make_cur_repl($row,$design) {
reset($row);//ne e nujno, ama ne pre4i
while (list($k,$v) = each($row))
$design = str_replace("#".$k."#",$row[$k],$design);
return $design;
}
и тогава може да се вадят данните от таблицата като се вика директно тази функция:
//v obekta resobj ima masiv s indexi - imenata na kolonite v
//mySQL tablicata i tqxnite stoinosti
function make_all_repl($resobj,$design) {
$cnt=0;//broi redovete, iskam da go razkaram
for ($i=0;$i<$resobj->num_rows;$i++) {
//Special replacments
$cnt++;
$design = str_replace("#nom#",$cnt,$design);
//end Special replacments
echo make_cur_repl($resobj->row[$i],$design);
}
}
Искам да махна специалния реплейсмънт и затова ми е нужно. Не претендирам, за това, че скриптовете ми са перфектни... сигурно може и по-добре да се направи... не ми се иска за нещо толкова елементарно да използвам допълнителни глупости за работа със темплейти (smarty). Разбира се някой ще каже, че оптимизацията е смешна.... пак казвам въпроса е принципен, просто ми е любопитно може ли да се направи.... това е!
Поздрави
а, за какво ми е.... ето подробно 100 процентово обяснение ;-)
Правя си собствена функция за replace на ключови думи и показване на данни взети от таблица. Ето как може да изглежда стринга в файла:
(file) design.des.php: "#nom#. #name#"
Стринга се повтаря толкова пъти колкото реда са селекнати от таблицата. Така поставени нещата функцията за replace изглежда така:
function make_cur_repl($row,$design) {
reset($row);//ne e nujno, ama ne pre4i
while (list($k,$v) = each($row))
$design = str_replace("#".$k."#",$row[$k],$design);
return $design;
}
и тогава може да се вадят данните от таблицата като се вика директно тази функция:
//v obekta resobj ima masiv s indexi - imenata na kolonite v
//mySQL tablicata i tqxnite stoinosti
function make_all_repl($resobj,$design) {
$cnt=0;//broi redovete, iskam da go razkaram
for ($i=0;$i<$resobj->num_rows;$i++) {
//Special replacments
$cnt++;
$design = str_replace("#nom#",$cnt,$design);
//end Special replacments
echo make_cur_repl($resobj->row[$i],$design);
}
}
Искам да махна специалния реплейсмънт и затова ми е нужно. Не претендирам, за това, че скриптовете ми са перфектни... сигурно може и по-добре да се направи... не ми се иска за нещо толкова елементарно да използвам допълнителни глупости за работа със темплейти (smarty). Разбира се някой ще каже, че оптимизацията е смешна.... пак казвам въпроса е принципен, просто ми е любопитно може ли да се направи.... това е!
Поздрави
Re: Няма как да стане ..
... с една заявка.
Променливата не е инициализирана при извикването на заявката и затова е NULL
Всъщост дори:
SELECT @x := @x+1 as num,ID, NAME FROM test;
е малко противопоказано защото принципно стойността на променлива не трябва да се използва в същата заявка в която се и присвоява.
Когато двете неща се правят едновременно не е гарантирано, че резултатът ще е смислен.
Цитирайки рководството:
[линк]
The general rule is to never assign a value to a user variable in one part of a statement and use the same variable in some other part the same statement. You might get the results you expect, but this is not guaranteed.
Общото правило е никога да не се присвоява стойност на потребителска порменлива и да се използва тази променлива в друга част на същата заявка.
Може да получите очаквания резултат, но това не е гарантирано.
salle.online.bg/sig
Променливата не е инициализирана при извикването на заявката и затова е NULL
Всъщост дори:
SELECT @x := @x+1 as num,ID, NAME FROM test;
е малко противопоказано защото принципно стойността на променлива не трябва да се използва в същата заявка в която се и присвоява.
Когато двете неща се правят едновременно не е гарантирано, че резултатът ще е смислен.
Цитирайки рководството:
[линк]
The general rule is to never assign a value to a user variable in one part of a statement and use the same variable in some other part the same statement. You might get the results you expect, but this is not guaranteed.
Общото правило е никога да не се присвоява стойност на потребителска порменлива и да се използва тази променлива в друга част на същата заявка.
Може да получите очаквания резултат, но това не е гарантирано.
salle.online.bg/sig