用于显示来自表A的数据和来自表B的数据的SQL查询,其中使用连接在表B中找到表A的parent_id

时间:2012-05-20 08:00:34

标签: mysql

使用MySQL。

我有两张桌子。表A和表B.

表A有一些值具有与表B相关的ID。该ID在表A中标识为crm_field,在表B中标识为parent_id。

我尝试过这个查询。

select * 
from tableA inner join tableB ON tableA.crm_field=tableB.parent_field 
WHERE tableA.id = '75' AND 
      tableA.category != 'null' AND 
      tableA.category != 'No Category'

我的预期结果是来自tableA的满足where要求的数据将与tableB的数据一起显示,tableB保存的parent_id等同于tableA中crm_field的数据。

实际结果是显示tableB,但保存值的parent_id除外。当crm_field = 0和parent_id = 0时,它似乎也要查询,当我想让它查询时crm_field有一个像parent一样的实际值,也可以在parent_id中找到。尝试这样做:

select * 
from tableA inner join tableB ON tableA.crm_field=tableB.parent_field 
WHERE tableA.id = '75' AND 
      tableA.category != 'null' AND 
      tableA.category != 'No Category' AND 
      tableA.crm_field != '0'

但它只显示了我需要添加到tableA的tableB中的数据。

有没有办法使用连接查询?

如果不是我也可以进行双重查询。

感谢

示例输出:

tableA  
id|name|crm_field|category  
0|dog|0|hi  
1|cat|22|hi  
2|bear|0|null|  


tableB  
id|name|parent_id|  
0|wild|22|  
1|foo|0|  

显示应该是这样的:

0|dog|0|hi  
1|cat|22|hi  
2|wild|22  

- 如果可能的话?

要达到我想在这里完成的目的是:

crm_field有一些值。

但是如果查询在crm_field中看到22或21或两者,那么它应该显示在tableB中找到的相应值。

知道我这样做,如果crm_field == 21或22它将执行另一个查询以将相应的值添加到数组。但我希望用尽可能少的代码来实现这一目标,因此我正在尝试加入。

1 个答案:

答案 0 :(得分:1)

关注UNION会获得给定输入的输出

SELECT  id, name, crmfield
FROM    TableA
WHERE   category != 'null'
UNION ALL
SELECT  a.id, b.name, a.crmfield
FROM    TableA AS a
        INNER JOIN TableB AS b ON b.parent_id = a.crm_field
WHERE   parent_id != '0'        

但是您的表格设计存在一些问题(正如JohnFx已经提到的那样)

  • 您永远不应在任何数据库中存储'null'字符串值。
  • 将您的外键命名为它们链接到的主键更容易(至少对我来说)。无法知道parent_idcrm_field相关联。我建议将TableB.parent_id重命名为TableB.crm_field,以便明确该链接。
  • 您不希望在结果中返回TableB.foo条记录。这让我很奇怪。我可以想象你只想要一些关系的某些部分归还,但在这里你似乎已经将0作为外键附加了一些特殊含义。