0

使用 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_id 中也找到的 22 之类的实际值时进行查询。尝试这样做:

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 我这样做了,它将执行另一个查询以将相应的值添加到数组中。但我想用尽可能少的代码来实现这一点,因此我正在尝试加入。

4

1 回答 1

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_idTableB.crm_field使该链接清晰。
  • 您不希望TableB.foo结果中返回记录。这让我觉得很奇怪。我可以想象您只希望返回关系的某些部分,但在这里您似乎已经附加了一些特殊含义0作为外键。
于 2012-05-20T08:46:58.660 回答