我到处找了找,找到了一个和我要找的差不多的例子,但在我的情况下不起作用。
我有一个对两个表进行内部联接的查询,这个联接实质上限制了我的整个数据集。然后我想左连接到第三个表,但我只需要第三个表中的一条记录。使用左联接的原因是,并非每个内部联接的结果在第3个表中都有匹配项。像这样:
SELECT DISTINCT t1.code, t2.id, t2.code, t3.id, t3.source_title, t3.display_order
FROM table1 t1
INNER JOIN table2 t2 ON t2.code=t1.code AND t2.type=0
LEFT JOIN table3 t3 ON t3.code=t1.code
ORDER BY t1.code, t3.display_order
此查询返回的记录太多,因为第三个表包含多个具有匹配代码的记录。我只想要与最低显示顺序值匹配的第一个,不幸的是,我不能将记录的显示顺序限制为1,因为最低显示顺序并不总是1。
重要提示:此查询返回的t3.id值(如果有)必须对应于显示顺序值最低的记录。i、 例如,如果查询正确返回最低显示顺序值,但t3.id值与表3中的其他记录相对应,则它将不起作用。
这有可能吗?任何帮助都将不胜感激。
编辑:根据尼克的建议,我试过这个,看起来很有效。我会做一些核实并报告:
SELECT DISTINCT t1.code, t2.*, sq.id, sq.source_title, sq.display_order
FROM table1 t1
INNER JOIN table2 p ON t2.code=t1.code AND t2.type=0
LEFT JOIN (
SELECT t3.*
FROM table3 t3
WHERE t3.display_order=(
SELECT MIN(display_order)
FROM table3 t3a
WHERE t3a.code = t3.code
)
) sq ON sq.code=t1.code
ORDER BY t1.code, sq.display_order
2条答案
按热度按时间l2osamch1#
在mysql 8.0中,您可以尝试使用
row_number()
对于每个代码,按display_order
在子查询中table3
. 然后左键连接该结果并检查row_number()
等于1。在较低版本中,您可以尝试按顺序排列的相关子查询
display_order
以及LIMIT 1
(只得到一条记录)。我以为
display_order
在table3
不是独一无二的但是id
是。所以我补充说id
到ORDER BY
子查询中的子句,以确保在每个子查询中选择相同的记录。如果display_order
是唯一的,你可以删除id
从ORDER BY
条款。编辑:
如果不想在(总体)中重复子查询
ORDER BY
子句中,也可以按列序数排序。例如。:n53p2ov02#
你应该可以替换
table3
在你的LEFT JOIN
具有