Те, що ви робите тут, називається a JOIN
(хоча ви робите це неявно, оскільки ви вибираєте з кількох таблиць). Це означає, що якщо ви не поставили жодних умов у своєму реченні WHERE, у вас були всі комбінації цих таблиць. Лише за вашим станом ви обмежуєте приєднання до тих рядків, де відповідає ідентифікатор напою.
Але в результатах для кожного напою все-таки є X кілька рядків, якщо є X фотографії з цим конкретним напоєм_id. Ваше твердження не обмежує, які фотографії ви хочете мати!
Якщо вам потрібен лише один рядок на напій, вам слід сказати SQL, що ви хочете зробити, якщо є кілька рядків з певним ідентифікатором drink_id. Для цього вам потрібна групування та сукупна функція . Ви вказуєте SQL, які записи ви хочете згрупувати (наприклад, усі рівні напитки_id), і в SELECT потрібно сказати, який із різних записів для кожного згрупованого рядка результатів слід взяти. Для чисел це може бути середнім, мінімальним, максимальним (щоб назвати деякі).
У вашому випадку я не бачу сенсу запитувати фотографії щодо напоїв, якщо вам потрібен лише один рядок. Ви, напевно, думали, що у кожному випивці у вас може бути безліч фотографій , але SQL не може цього зробити. Якщо ви хочете лише будь-яку фотографію, і вам не важливо, яку ви отримаєте, просто згрупуйте за напитком_ідентифікатора (щоб отримати лише один рядок за напій):
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.