php - MySQL 双表 INNER JOIN,LEFT JOINED 到第三个表,只有一行具有最低值

标签 php mysql sql mysqli pdo

我四处搜索,发现了一个 near example到我正在寻找的东西,但它在我的情况下不起作用。

我有一个在两个表上执行 INNER JOIN 的查询,这个连接大大限制了我的整体数据集。然后我想 LEFT JOIN 到第三个表但我只想要第三个表中的一条记录。左连接的原因是因为并非 INNER JOIN 的每个结果在第三个表中都有匹配项。像这样:

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

此查询返回太多记录,因为第三个表包含多个具有匹配代码的记录。我只想要第一个匹配最低 display_order 值的记录,不幸的是,我不能将记录限制为 display_order=1,因为最低显示顺序并不总是一个。

重要:此查询返回的 t3.id 值(如果有)必须对应于具有最低 display_order 值的记录。即,它将不起作用如果查询正确返回最低的 display_order 值,但 t3.id 值对应于表 3 中的其他一些记录。

这可能吗?任何帮助将不胜感激。

编辑:根据 Nick 的建议,我已经尝试过了,这似乎有效。我会做一些验证并报告回来:

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

最佳答案

您应该能够将 LEFT JOIN 中的 table3 替换为

(SELECT * 
 FROM table3 t3 
 WHERE display_order = (SELECT MIN(display_order) 
                        FROM table3 t3a 
                        WHERE t3a.code = t3.code)
) t3

关于php - MySQL 双表 INNER JOIN,LEFT JOINED 到第三个表,只有一行具有最低值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52395654/

相关文章:

mysql - SQL连接不同大小的表以及空值替换

php - 如何使用 Laravel 5.1 将上传的文件名保存在表中

mysql - 如何替换mysql中JSON键的值

mysql - 无法在简单代码上添加外键约束请帮忙

sql - 在sql中将每月值与每日值连接起来

javascript - 如何打印 html 表格中仅一个单元格关联的结果集

php - symfony Doctrine 类型日期时间预期格式 y-m-d h :i:s

php - 通过网络发送密码

php - Apache/PHP errors.log 和 access.log 奇怪的消息

mysql - Laravel:将结果与 UnionAll 和 where 条件结合起来