如何在一个具有两个订单字段的查询中对2个相关表进行排序

时间:2019-04-04 21:41:19

标签: mysql sql

我有2个表,第一个是ITEMS,另一个是GALLERY(这里有每个项目的图像),这2个表与item_id = item_gal_id相关。

在这2个表中,有2个重要字段,item_order(在ITEMS中)和img_order(在GALLERY中),我使用它们通过拖放来排序项目和图像。

通过此查询,我可以定购并输出主页中的项目:

SELECT * 
FROM items a 
LEFT JOIN gallery b ON (a.item_id = b.item_gal_id) 
WHERE a.it_public='SI' 
GROUP BY a.item_id, b.item_gal_id 
ORDER BY a.item_order ASC

但是...每个项目在首页中显示1张(一张)图像,而该图像不是应该的那个,我的意思是我无法输出GALLERY订单中第一位的图像...

当我点击其中一个项目进入详细信息页面时,使用此查询很容易按照我想要的顺序显示图像:

SELECT * 
FROM gallery 
WHERE item_gal_id = (the item_id I send by GET) 
ORDER BY img_order ASC

那么,如何显示由item_order排序的项目列表,并在同一查询中显示该图像的第一个具有img_order的项目,有没有办法做到这一点?

我已经搜索和阅读了2天,但没有运气,尝试了几种选择,但是我真的很喜欢这个。

2 个答案:

答案 0 :(得分:0)

改为使用子查询:

SELECT i.*,
       (SELECT g.item_gal_id
        FROM gallery g
        WHERE g.item_gal_id = i.item_id
        ORDER BY g.item_gal_id
        LIMIT 1
       ) as item_gal_id
FROM items i 
WHERE i.it_public = 'SI'
ORDER BY i.item_order ASC;

如果您需要gallery中的其他列,请将其用作子查询并重新加入gallery

答案 1 :(得分:0)

如果只想为每个item_gal_id提取最小的item,则可以使用简单的JOIN进行汇总。这要求您明确列出要显示的items中的列(我假设为item_idcol1col2)。

SELECT i.item_id, i.col1, i.col2, MIN(g.item_gal_id)
FROM items i
LEFT JOIN gallery g ON i.item_id = g.item_gal_id
WHERE i.it_public = 'SI' 
GROUP BY i.item_id, i.col1, i.col2
ORDER BY i.item_order

如果从gallery中获得的信息不只是item_gal_id,那么一种解决方案是使用窗口函数ROW_NUMBER()(仅在MySQL 8.0中可用):

SELECT * 
FROM (
    SELECT 
        i.item_id,
        i.item_order,
        i.col1, 
        i.col2, 
        g.item_gal_id, 
        g.col3, 
        g.col4,
        ROW_NUMBER() OVER(PARTITION BY i.item_id ORDER BY g.item_gal_id) rn
    FROM items i
    LEFT JOIN gallery g ON i.item_id = g.item_gal_id
    WHERE i.it_public = 'SI' 
) x 
WHERE rn = 1
ORDER BY item_order

Edit :根据注释,这是不带窗口功能的另一个选项,使用条件为NOT EXITS的相关子查询对最低{{1 }}。

img_order