mysql - 为 3 个 mySQL 表之间的每个结果显示一行

标签 mysql sql

我有两个表,它们可以有多个记录链接到另一个表,但我不希望 mySQL 将行组合在一起。示例:

  • test_main 包含字段 mainID、field1。
  • test_veg 包含一个蔬菜名称的记录,链接到 test_main 中 ID=1 的记录
  • test_fruit 包含两条记录,每条记录都有一个水果名称,均链接到 test_main 中 ID=1 的记录

在此示例中,有 3 个记录链接到 test_main - 1 个 test_veg 和 2 个 test_fruit。我想让这 3 行得到如下结果:

field1               vegName  fruitName
-------------------  -------  ---------
stuff in main table  cabbage  NULL
stuff in main table  NULL     apple
stuff in main table  NULL     pear

我还想要来自 test_main 的记录,这些记录没有链接到任何 test_veg 或 test_fruit 记录。

这看起来很简单,但我无法让它工作。有什么想法吗?

如果我只有两个表(例如 test_main 和 test_veg),则左连接就可以工作。对于 3 个表,两个左连接仅返回两行:

SELECT  test_main.field1, test_veg.vegName, test_fruit.fruitName
FROM test_main
LEFT  JOIN test_veg ON test_veg.mainID = test_main.mainID
LEFT  JOIN test_fruit ON test_fruit.mainID = test_main.mainID
WHERE test_main.mainID=1

field1               vegName  fruitName
-------------------  -------  ---------
stuff in main table  cabbage  apple
stuff in main table  cabbage  pear

注意,我坚持使用 mySQL3,这意味着没有像 WHERE 中的 SELECT 或 UNION 之类的花哨的东西。

最佳答案

我不久前读过一篇非常酷的文章,内容是关于欺骗 MySQL3.x 来模仿 UNION。您需要创建一个 DUMMY 表,其中包含并集所需的行数。因此,如果您有 1 个联合(这是 2 个不同的选择语句),则虚拟表中需要 2 行。

尝试这样的事情:

SELECT m.field1, v.vegName, f.fruitName
FROM test_main m
INNER JOIN dummy d 
  ON d.id < 3
LEFT JOIN test_veg v 
  ON v.mainID = m.mainID 
  and d.id = 1
LEFT JOIN test_fruit f 
  ON f.mainID = m.mainID 
  and d.id = 2
WHERE m.mainid=1

这是SQL Fiddle更好地帮助您跟进。

关于mysql - 为 3 个 mySQL 表之间的每个结果显示一行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14384032/

相关文章:

javascript - 在 MysQl NodeJS 查询上转义数据数组的最佳方法

php - 使用 "OR"和 "AND"mysql php

sql - 正则表达式匹配具有多行和相同列数的 SQL 值字符串

mysql - 如何找到表中每一列的最大值?

sql - 获取出现 2 次特定事件的行

sql - 从表中选择 @variable in(表列)

php - 尝试在 Laravel 5.4 中使用身份验证为我的网站注册时出现以下错误

mysql - 获取表a中与表b匹配的所有行

mysql - 选择已售出和未售出的产品

sql - sql server中两个连续日期之间的差异(以天为单位)