Порядок более чем в 1 поле в запросах INNER JOIN - PullRequest
0 голосов
/ 06 октября 2011

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

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

Каждый продукт в базе данных имеет несколько изображений, связанных с ним. Запрос выше перечисляет продукт с 1 изображением этого продукта. Каждое изображение имеет поле с отметкой времени, которую получает запись при загрузке изображения. Мне нужно изменить приведенный выше SQL-запрос, чтобы получить, скажем, первое изображение, которое было загружено для определенного продукта, что-то вроде ORDER BY UPLOAD_TIME ASC. Кто-нибудь может мне помочь с этим?

Спасибо.

Ответы [ 2 ]

1 голос
/ 06 октября 2011

Вот два способа фактически контролировать, какую строку вы получаете в MySQL, когда вы хотите первую строку для группы

Использование предела 1

SELECT products.id, 
       products.title, 
       products.size, 
       products.price, 
       products.text_description, 
       products.main_description, 
       products.priority, 
       gallery.id, 
       gallery.main 
FROM products
CROSS JOIN 
 (SELECT   
       gallery.id, 
       gallery.main  
    FROM 
        gallery
    WHERE
        products.[id] = gallery.[id]
    ORDER BY 
        gallery.[timestamp] DESC
    LIMIT 1) gallery
GROUP BY 
    products.priority ASC

Теперь это тоже работает. Использование MAx ()

SELECT products.id, 
       products.title, 
       products.size, 
       products.price, 
       products.text_description, 
       products.main_description, 
       products.priority, 
       gallery.id, 
       gallery.main 
FROM products
INNER JOIN gallery 
ON products.id = gallery.id
INNER JOIN 
   (SELECT   
       max(gallery.timestamp) timestamp, 
       gallery.[id]
    FROM 
        gallery
    GROUP BY
        gallery.[id]
    ) maxgallery
ON gallery.id = maxgallery.id and gallery.timestamp = maxgallery.timestamp
GROUP BY 
    products.priority ASC

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

Если есть две записи, которые совместно используют id и метку времени, используя LIMIT 1, будет возвращена только одна запись. При использовании MAX() может быть возвращено более одной записи.

Я оставлю это вам, какой из них предпочтительнее или если это вообще что-то меняет.

0 голосов
/ 06 октября 2011
INNER JOIN 
    (SELECT TOP 1 
         col1,
         col2,...,
         coln 
    FROM 
        products 
    WHERE
        products.[id] = gallery.[id]
    ORDER BY
        products.[timestamp] DESC)
ON...

Это будет более медленный запрос, поскольку он должен выполнять вложенный подзапрос для каждой строки в основном запросе ... возможно, загрузка соответствующих данных таблицы в таблицу в памяти ускорит его.

...