Как я могу получить один результат из связанной таблицы в SQL? - PullRequest
3 голосов
/ 31 августа 2011

У меня следующий запрос SQL:

SELECT 
 gallery.id, 
 gallery.thumbnail_big, 
 products.id, 
 products.title, 
 products.size, 
 products.price, 
 products.text_description, 
 products.main_description 
FROM 
 gallery, 
 products 
WHERE gallery.id=products.id

Он получает данные из 2 таблиц - "продукты" и "галерея".Таблица «Галерея» содержит изображения товаров.Каждое изображение имеет свой идентификатор, который равен идентификатору продукта.Каждый продукт имеет несколько изображений, поэтому, если я получу данные, как в случае запроса, указанного выше, я получу все изображения каждого продукта.Мне нужно получить 1 изображение, хотя.1 изображение на продукт.Я знаю, что могу сделать это, используя ключевое слово DISTINCT.Однако я не могу понять, как это следует использовать с моим запросом.

Ответы [ 4 ]

2 голосов
/ 31 августа 2011

Поскольку вы используете MySQL, я дам вам специфичное для MySQL решение, которое очень просто:

SELECT 
 gallery.id, 
 gallery.thumbnail_big, 
 products.id, 
 products.title, 
 products.size, 
 products.price, 
 products.text_description, 
 products.main_description 
FROM gallery
INNER JOIN products 
ON gallery.id=products.id
GROUP BY products.id

Конечно, это возвращает произвольные gallery.id и thumbnail_big, но вы этого не сделалиуказал, какой вы хотите.На практике это будет тот, который сначала физически хранится в таблице, но у вас мало контроля над этим.

Вышеприведенный запрос неоднозначен, поэтому он не будет разрешен ANSI SQL и большинством брендов.СУРБД.Но MySQL допускает это (SQLite тоже делает, чего бы это ни стоило).

Лучшее решение - сделать запрос не двусмысленным.Например, если вы хотите получить изображение галереи, имеющее самое высокое значение первичного ключа:

SELECT 
 g1.id, 
 g1.thumbnail_big, 
 p.id, 
 p.title, 
 p.size, 
 p.price, 
 p.text_description, 
 p.main_description 
FROM products p
INNER JOIN gallery g1 ON p.id = g1.id
LEFT OUTER JOIN gallery g2 ON p.id = g2.id AND g1.pkey < g2.pkey
WHERE g2.id IS NULL

Я должен предположить, что у вас есть другой столбец gallery.pkey, который является автоинкрементным или иным образом служит для уникальногоразличать галерею изображений для данного продукта.Если у вас нет такого столбца, вам нужно его создать.

Затем запрос пытается найти строку g2 для того же продукта, которая больше g1.Если такой строки не существует, то g1 должна быть самой большой строкой.

2 голосов
/ 31 августа 2011

Вам необходимо указать, какое из значений из галереи вы хотите.То, что вы просите вашу базу данных, - это произвольно отбрасывать записи, которые вы специально указали для выбора.

Что некоторые люди будут делать, это добавлять MAX или MIN к столбцам, которые им не нужныдублировать.Каждый раз, когда я видел, как это было сделано, это потому, что в их запросах была неверная логика ....

Что вы на самом деле пытаетесь выбрать из галереи?Если мы знаем, что мы, возможно, можем помочь написать ваш запрос.

ОБНОВЛЕНИЕ

Этот метод применяется только для получения первой записи галереи (упорядоченной по gallery.id) для каждого продукта.

SELECT 
 gallery.id, 
 gallery.thumbnail_big, 
 products.id, 
 products.title, 
 products.size, 
 products.price, 
 products.text_description, 
 products.main_description 
FROM  
 products p
OUTER APPLY
        (
        SELECT  TOP 1 g.id, g.thumbnail_big,
        FROM    gallery g
        WHERE   g.id= p.id
        ORDER BY
                g.id DESC
        ) g
0 голосов
/ 31 августа 2011

Идеальный кандидат для группы по комбинации или с комбинацией.

SELECT 
 gallery.id, 
 gallery.thumbnail_big, 
 products.id, 
 products.title, 
 products.size, 
 products.price, 
 products.text_description, 
 products.main_description 
FROM 
 products,
 gallery 

WHERE gallery.id=products.id
GROUP BY products.id
HAVING MIN(gallery.id)

Вернет вам все товары, по одному изображению.Однако для изображения было выбрано изображение с минимальным идентификатором.

0 голосов
/ 31 августа 2011

Вы не говорите, что имеет значение, какую картинку вы показываете, так что это самый простой способ получить только одну:

SELECT 
 products.id, 
 products.title, 
 products.size, 
 products.price, 
 products.text_description, 
 products.main_description,
 MAX(gallery.thumbnail_big) AS thumbnail_big, 
FROM 
 products,
 gallery
WHERE
 products.id = gallery.id
GROUP BY
 products.id, 
 products.title, 
 products.size, 
 products.price, 
 products.text_description, 
 products.main_description,
...