Автор Тема: Mysql недомислица  (Прочетена 1414 пъти)

VladSun

  • Moderator
  • Напреднали
  • *****
  • Публикации: 2166
    • Профил
Mysql недомислица
« -: 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
Активен

KISS Principle ( Keep-It-Short-and-Simple )
http://openfmi.net/projects/flattc/
Има 10 вида хора на този свят - разбиращи двоичния код и тези, които не го разбират :P

mom

  • Напреднали
  • *****
  • Публикации: 266
  • Distribution: Ubuntu
  • Window Manager: Compiz
    • Профил
Mysql недомислица
« Отговор #1 -: Jun 11, 2007, 17:28 »
махни group by или го направи на order by - подозирам, че второто си искал да направиш, защото първото е безсмислено, освен ако в group by не добавиш и estates.price и estate_pictures.name

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

VladSun

  • Moderator
  • Напреднали
  • *****
  • Публикации: 2166
    • Профил
Mysql недомислица
« Отговор #2 -: 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 ...



Активен

KISS Principle ( Keep-It-Short-and-Simple )
http://openfmi.net/projects/flattc/
Има 10 вида хора на този свят - разбиращи двоичния код и тези, които не го разбират :P

mom

  • Напреднали
  • *****
  • Публикации: 266
  • Distribution: Ubuntu
  • Window Manager: Compiz
    • Профил
Mysql недомислица
« Отговор #3 -: 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




Активен

VladSun

  • Moderator
  • Напреднали
  • *****
  • Публикации: 2166
    • Профил
Mysql недомислица
« Отговор #4 -: Jun 11, 2007, 23:40 »
Честно казано подозирах, че искаш да кажеш същото '<img'>

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

Аз поради това писах "недомислица" в заглавието на темата '<img'>

А относно order by rand () - по-лесен random select няма '<img'>



Активен

KISS Principle ( Keep-It-Short-and-Simple )
http://openfmi.net/projects/flattc/
Има 10 вида хора на този свят - разбиращи двоичния код и тези, които не го разбират :P

Подобни теми
Заглавие Започната от Отговора Прегледи Последна публикация
MySql малък проблем.
Хардуерни и софтуерни проблеми
Marto 6 9013 Последна публикация Sep 25, 2002, 12:32
от
mysql въпрос
Настройка на програми
dumi 0 2223 Последна публикация Oct 08, 2003, 06:42
от dumi
Perl + CGI,DBI + Mysql ili PHP + Mysql
Общ форум
jica 3 8974 Последна публикация Sep 07, 2004, 17:02
от jica
Mysql проблем със стартирането(mysql.sock missing)
Настройка на програми
coveka 6 11231 Последна публикация Mar 01, 2008, 22:02
от coveka
Mysql: can't connect to local mysql server
Настройка на програми
wonder 1 9892 Последна публикация Mar 16, 2008, 01:17
от neter