2012-05-20 28 views
0

使用MySQL。Sql查詢顯示來自表A的數據和來自表B的數據,其中表B的parent_id在表B中使用連接加入

我有兩個表。表A和表B.

表A有具有表B.與表B的ID此ID標識爲表A crm_field和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了符合地方需求的數據將與tableB的持有的PARENT_ID等同於表A的crm_field的顯示屏。

實際結果是顯示tableB,除了包含值的parent_id。也似乎它查詢時crm_field = 0和parent_id = 0,當我想要它查詢時crm_field有一個像22也是在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' 

但它只顯示tableB的數據,我需要添加到tableA。

有沒有辦法使用連接查詢來做到這一點?

如果不是,我不妨做一個雙重查詢。

感謝

輸出示例:

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它會做另一個查詢將相應的值添加到數組。但我想用盡可能少的代碼來完成此任務,因此我正在嘗試使用join。

+0

您使用的數據庫是? – JohnFx

+0

抱歉。使用mysql – magicianiam

+0

你是故意查詢字符串'空'還是你的意思是實際檢查空值? – JohnFx

回答

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_id已鏈接到crm_field。我建議將TableB.parent_id重新命名爲TableB.crm_field,以使該鏈接清晰。
  • 您不希望結果中返回TableB.foo記錄。這讓我覺得很奇怪。我可以想象,你只希望返回一些關係的某些部分,但在這裏你似乎將0作爲外鍵附加了一些特殊含義。
+0

是的,我只需要從包含22或21的表中檢索數據作爲它們的parent_id,前提是crm_field包含22或21,否則不應檢索tableb。從現在起,我不會在sql中使用'null'作爲條件的一部分,因爲它肯定是相當危險的。謝謝你,我現在就試試。 – magicianiam

相關問題