2

我有两个表可以有多个记录链接到另一个表,但我不希望 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

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

4

2 回答 2

2

不久前我读到了一篇非常酷的文章,关于欺骗 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,可以更好地帮助您跟进。

于 2013-01-17T17:13:55.577 回答
0

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

test_veg.mainID is NULL and test_fruit.main_id is NULL

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

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

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

于 2013-01-17T17:11:13.683 回答