Ответ 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.