Подтвердить что ты не робот

SELECT * FROM из нескольких таблиц. MySQL

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

yeilds 5 строк (5 массивов), photo - единственное уникальное поле в строке. name, price повторяется (здесь fanta- name, price повторяется 3 раза.) Как мне избавиться от этих дубликатов?

Изменить: Я хочу name, price и все photo для каждого напитка.

 id      name      price
  1.    fanta        5
  2.     dew         4


 id      photo                   drinks_id
  1.     ./images/fanta-1.jpg      1
  2.     ./images/fanta-2.jpg      1  
  3.     ./images/fanta-3.jpg      1 
  4.     ./images/dew-1.jpg        2
  5.     ./images/dew-2.jpg        2
4b9b3361

Ответ 1

Что вы здесь делаете, называется JOIN (хотя вы делаете это неявно, потому что вы выбираете из нескольких таблиц). Это означает, что если вы не задали никаких условий в своем предложении WHERE, у вас были все комбинации этих таблиц. Только с вашим условием вы ограничиваете свое соединение теми строками, в которых совпадает идентификатор напитка.

Но есть все еще X несколько строк в результате для каждого напитка, если есть X фотографий с этим конкретным drink_id. Ваше выражение не ограничивает фотографии, которые вы хотите иметь!

Если вам нужна только одна строка за напиток, вам нужно сказать SQL, что вы хотите сделать, если есть несколько строк с определенным напитком_ид. Для этого вам нужна группировка и агрегатная функция. Вы указываете SQL, какие записи вы хотите группировать (например, все равные drink_ids) и в SELECT, вы должны указать, какая из отдельных записей для каждой сгруппированной строки результатов должна быть взята. Для чисел это может быть среднее, минимальное, максимальное (для обозначения некоторых).

В вашем случае я не вижу смысла запрашивать фотографии для напитков, если вам нужна только одна строка. Вероятно, вы подумали, что у вас может быть множество фотографий в вашем результате для каждого напитка, но SQL не может этого сделать. Если вам нужна только фотография, и вам все равно, что вы получите, просто сгруппируйте drink_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.

Ответ 2

Здесь вы будете иметь повторяющиеся значения для имени и цены. И идентификаторы дублируются в таблице drinks_photos. Вы не можете избежать их. Также, что именно вы хотите получить?

Ответ 3

Чтобы избавиться от дубликатов, вы можете группировать drinks.id. Но таким образом вы получите только одну фотографию для каждого drinks.id (какая фотография вы получите, зависит от внутренней реализации базы данных).

Хотя он не задокументирован, в случае MySQL вы получите фотографию с самым низким id (по моему опыту, я никогда не видел другого поведения).

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