Linux за българи: Форуми

Програмиране => Web development => Темата е започната от: VladSun в Jun 11, 2007, 14:59



Титла: Mysql недомислица
Публикувано от: VladSun в Jun 11, 2007, 14:59
Примерен код


            select
            estates.id as estates_id, estates.price
            estate_pictures.name as pic_name,
            from estates
            left join estate_pictures on estate_pictures.estate_id = estates.id
            group by estates.id


В estate_pictures имаме няколко записа за съответното estates.id.

Това не дава грешка и връща само един запис!

MySQL 5.0.16-max


Титла: Mysql недомислица
Публикувано от: mom в Jun 11, 2007, 17:28
махни group by или го направи на order by - подозирам, че второто си искал да направиш, защото първото е безсмислено, освен ако в group by не добавиш и estates.price и estate_pictures.name

В Postgresql изобщо няма да можеш да направиш подобно изказване


Титла: Mysql недомислица
Публикувано от: VladSun в Jun 11, 2007, 20:22
Цитат (mom @ Юни 11 2007,17:28)
махни group by или го направи на order by - подозирам, че второто си искал да направиш, защото първото е безсмислено, освен ако в group by не добавиш и estates.price и estate_pictures.name

В Postgresql изобщо няма да можеш да направиш подобно изказване

Аз съм се оправил - със субселект. Въпросът е, че такава SQL заявка не би трябвало изобщо да се изпълни!

А и ако направя order by или махна group by в *тази* заявка ще получа мултиплициране на резултата заради това, че имам няколко записа в estate_pictures, които имат исканото estates.id ...

Целта на заявката е да изкара по един запис за всеки estates.id със само едно estate_pictures.name.
Цялата ми заявка изглежда така ... вече:

Примерен код

select
   estates.id as estates_id, ".$lan."_notice, estates.price as estate_price, estates.floorage as estate_floorage,
   (select estate_pictures.name
      from estate_pictures where estate_pictures.estate_id=estates.id
      order by rand() limit 1) as pic_name,
   types.".$lan."_name as type_name,
   areas.".$lan."_name as area_name
   from estates
      inner join types on types.id = estates.type_id
      inner join areas on areas.id = estates.area_id
   where estates.attractive = 1
   order by rand()


Пак повтарям - темата е за това, че MySQL не интерпретира коректно тази заявка - няма агрегираща функция -> няма group by ...





Титла: Mysql недомислица
Публикувано от: mom в Jun 11, 2007, 23:09
Сега като си чета поста виждам, че не е ясно, но всъщност се опитвах да кажа същото, а именно, че такава заявка (като в първия ти пост) е странна. PostgreSQL не позволява подобна заявка и плаче, че трябва и другите полета в SELECT клаузата да присъстват в GROUP BY.

Не мога да отсъдя дали MySQL-а трябва да позволява такава заявка - нека MySQL гуру-тата се изкажат тука, но от гледна точка на логиката съм съгласен, че не би трябвало да е позволена.

VladSun, явно не съм те разбрал каква е целта на заявката (то и ти не си я написал де) и затова си помислих, че искаш да извлечеш резултат ала:
имот_1 | цена | ...... | снимка_1
имот_1 | цена | ...... | снимка_2
.............................................
имот_1 | цена | ...... | снимка_N
.............................................
имот_M | цена | ...... | снимка_1
имот_M | цена | ...... | снимка_2
..............................................
имот_M | цена | ...... | снимка_K

Определено заявката във втория ти пост ще свърши работа. Тъй като не ползвам MySQL ще поразгледам дали мога да се изкажа по подобен начин в PostgreSQL - стана ми интересно.

edit:
Става и в PostgreSQL:
Примерен код
SELECT col_name
FROM table_name
ORDER BY RANDOM()
LIMIT 1






Титла: Mysql недомислица
Публикувано от: VladSun в Jun 11, 2007, 23:40
Честно казано подозирах, че искаш да кажеш същото :)

Въпросът тук е по-скоро концептуален - нито един SQL engine не би трябвало да позволява подобна заявка - въпреки, че MySQL връща резултат се чупят поне две концепции:
1) group by се използва при агрегиращи функции (*само* AFAIK);
2) резултатът е неопределен - не може да се детерминира кой точно запис от estate_pictures е взет и по какви критерии.

Аз поради това писах "недомислица" в заглавието на темата :)

А относно order by rand () - по-лесен random select няма :)