Выберите * из нескольких таблиц. MySQL



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



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



Edit: я хочу 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
428   3  

3 ответов:

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

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

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

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

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

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

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

Comments

    Ничего не найдено.