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

时间:2013-01-17 16:51:11

标签: mysql sql

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

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

在此示例中,有三条记录链接到test_main - 一个test_veg和两个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

NB我坚持使用mySQL3,这意味着没有像WHERE中的SELECT那样花哨的东西,也没有UNIONs。

2 个答案:

答案 0 :(得分:2)

有一篇非常酷的文章,我曾经读过有关将MySQL3.x欺骗为模仿UNION的文章。您需要创建一个DUMMY表,其中包含Unions所需的行数。因此,如果你有1个union(这是2个不同的select语句),你需要在dummy表中有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可以更好地帮助您顺利完成。

答案 1 :(得分:0)

在您的查询中,您可以将以下内容添加到where子句:

test_veg.mainID is NULL and test_fruit.main_id is NULL

这将使主要的东西既不是水果也不是蔬菜。

但是,我认为您的数据存在问题。

同一输出行上的所有内容都具有相同的MaindID。因此,白菜需要与苹果和梨相同mainID。但是,如果我正确地理解了这个问题,那么mainId应该区分苹果和梨之类的东西。