我有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天,但没有运气,尝试了几种选择,但是我真的很喜欢这个。
答案 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_id
,col1
和col2
)。
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