Mysql
 sql >> база данни >  >> RDS >> Mysql

ИЗБЕРЕТЕ * ОТ множество таблици. MySQL

Това, което правите тук, се нарича JOIN (въпреки че го правите имплицитно, защото избирате от множество таблици). Това означава, че ако не сте поставили никакви условия в клаузата си WHERE, сте имали всички комбинации от тези маси. Само с вашето условие ограничавате присъединяването си до онези редове, където идентификаторът на напитката съвпада.

Но все още има X множество реда в резултата за всяка напитка, ако има X снимки с този конкретен drinks_id. Вашето изявление не ограничава кое снимка(и), която искате да имате!

Ако искате само един ред на напитка, трябва да кажете на SQL какво искате да направите, ако има няколко реда с определен идентификатор на напитки. За това имате нужда от групиране и обобщаваща функция . Вие казвате на SQL кои записи искате да групирате заедно (например всички равни drinks_ids) и в SELECT трябва да кажете кои от отделните записи за всеки групиран ред с резултати трябва да бъдат взети. За числата това може да бъде средно, минимално, максимално (за да назовем някои).

Във вашия случай не виждам смисъл да питате снимките за напитки, ако искате само един ред. Вероятно сте мислили, че можете да имате масив от снимки във вашия резултат за всяка напитка, но SQL не може да направи това. Ако искате само някои снимка и не ви пука кое ще получите, просто групирайте по drinks_id (за да получите само един ред на напитка):

SELECT name, price, photo
FROM drinks, drinks_photos
WHERE drinks.id = drinks_id 
GROUP BY drinks_id

name     price   photo
fanta    5       ./images/fanta-1.jpg
dew      4       ./images/dew-1.jpg

В MySQL също имаме GROUP_CONCAT , ако искате имената на файловете да бъдат свързани в един единствен низ:

SELECT name, price, GROUP_CONCAT(photo, ',')
FROM drinks, drinks_photos
WHERE drinks.id = drinks_id 
GROUP BY drinks_id

name     price   photo
fanta    5       ./images/fanta-1.jpg,./images/fanta-2.jpg,./images/fanta-3.jpg
dew      4       ./images/dew-1.jpg,./images/dew-2.jpg

Това обаче може да стане опасно, ако имате , в стойностите на полето, тъй като най-вероятно искате да разделите това отново от страна на клиента. Това също не е стандартна SQL агрегатна функция.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как работи операторът LIKE в MySQL

  2. Трябва ли да използвам типа данни за дата и час в MySQL?

  3. Има ли еквивалент на Profiler за MySql?

  4. SELECT / GROUP BY - сегменти от време (10 секунди, 30 секунди и т.н.)

  5. Копиране/дублиране на база данни без използване на mysqldump