簡體   English   中英

SQL查詢以顯示表A中的數據和表B中的數據,其中使用聯接在表B中找到表A的parent_id

[英]Sql query to display data from table A and data from table B where parent_id of table A is found in table B using join

使用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'

我的預期結果是,將顯示滿足where要求的tableA中的數據以及具有與tableA中crm_field等效的parent_id的tableB數據。

實際結果是顯示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'

但是它只顯示了我需要添加到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,它將執行另一個查詢以將相應的值添加到數組。 但是我想用盡可能少的代碼來實現這一點,因此我正在嘗試加入。

跟隨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_idTableB.crm_field制作鏈接清楚。
  • 您不希望在結果中返回TableB.foo記錄。 這讓我感到奇怪。 我可以想象您只希望返回關系的某些部分,但是在這里您似乎已經將0作為外鍵附加了一些特殊含義。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM