【问题标题】:Left join multiple rows左连接多行
【发布时间】:2019-11-02 20:44:01
【问题描述】:

我有以下表格:

我想合并这两个表,这样我就可以将农场表上的每个农场与农产品表上的每个产品一起列出,但我不确定如何。这是我到目前为止所得到的:

SELECT p.*, f.farm_name, f.county
FROM produce p
LEFT JOIN farms f on p.farm_id = f.id
GROUP by f.id
ORDER BY f.farm_name

【问题讨论】:

    标签: sql join left-join


    【解决方案1】:
    SELECT p.*
    FROM produce p
    inner join farms f on p.farm_id = f.id
    

    在您的php 获取代码中这样做,

    $row["farm_name"];
    

    它将在每个农产品行中返回农场名称。

    【讨论】:

    • 啊,是的,我不应该把它分组。谢谢!
    【解决方案2】:

    以前版本的 SQL 标准(SQL-92 和更早版本)不允许使用 SELECT HAVINGORDER BY 子句的查询指的是未在GROUP BY 子句。如果您回顾您的原始查询,您会发现您的查询完全符合这些标准所不允许的。

    SELECT p.*, f.farm_name, f.county
    ...
    GROUP BY f.id
    

    “非聚合列”是指任何不使用聚合函数的列,例如 sum() count() av​​g() 等

    为了使您的查询符合这些标准, select 下列出的每一列都将在该 group by 子句中指定,而不仅仅是一个。 MySQL 有一个特性,它允许您运行不合规样式的分组查询。如果它通知您查询是不正确的语法,您可能会意识到 group by 在这里对您没有帮助。

    这表明您正在使用 MySQL,并且您没有开启 SQL 模式 ONLY_FULL_GROUP_BY

    我敦促您避免这个 MySQL 弱点,打开 SQL 模式 ONLY_FULL_GROUP_BY

    见: https://dev.mysql.com/doc/refman/8.0/en/group-by-handling.html

    【讨论】:

    • 您的第一段不再完全适用于 SQL 标准的更新版本。如果 GROUP BY 包含 SELECT 列表中的所有其他列都依赖于功能的列(例如,按 PK 分组),则 SQL 标准确实允许从 group by 中省略那些功能依赖的列
    • 该声明是正确的,因为我指定了我所指的标准。确实,最近版本的 SQL 标准通过“功能依赖”允许列的可选列表,我选择省略它以简化基本信息。注意:我稍微修改了第一句话,使其更加明确。
    猜你喜欢
    • 1970-01-01
    • 2013-05-16
    • 2014-07-20
    • 1970-01-01
    • 1970-01-01
    • 2016-12-17
    • 2019-09-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多