[英]How to join two tables and get specific records only
如何聯接兩個表並僅獲取特定記錄?
我有兩張桌子
supp_id
, supp_code
, supp_name
, address
) supplier_id
, is_selected
,date_a) 我將所有供應商加載到網格視圖,並通過復選框選擇特定的供應商
對於供應商表中的特定日期,然后轉到SelectedSupplier
表。
當我從SelectedSupplier
表中加載保存的供應商時,我需要從兩個表中查看所有供應商。 這意味着如果我添加了一個新的供應商,則應在第二次加載時顯示。
這是我的查詢
SELECT
`supplier`.`supp_id`,
`supplier`.`supp_name`,
`supplier`.`address`,
`supplier`.`supp_code`,
`SelectedSuppliers `.`is_selected`
FROM
`SelectedSuppliers `
LEFT JOIN
`supplier` ON (`shop_list`.`supplier_id` = `supplier`.`supp_id`)
WHERE
SelectedSuppliers.date_a = '2013-1-5'
它可以工作,但僅加載SelectedSupplier
記錄,而不是所有記錄
謝謝。
SELECT
`supplier`.`supp_id`,
`supplier`.`supp_name`,
`supplier`.`address`,
`supplier`.`supp_code`,
`SelectedSuppliers `.`is_selected`
FROM 'supplier',`SelectedSuppliers`
LEFT JOIN `supplier`
ON (`shop_list`.`supplier_id` = `supplier`.`supp_id`)
where SelectedSuppliers.date_a = '2013-1-5'
請看一下圖片
只需顛倒連接順序,然后將條件移到ON
子句中,即可使左連接仍然有效:
SELECT
`supplier`.`supp_id`,
`supplier`.`supp_name`,
`supplier`.`address`,
`supplier`.`supp_code`,
`SelectedSuppliers `.`is_selected`
FROM `supplier`
LEFT JOIN `SelectedSuppliers `
ON `shop_list`.`supplier_id` = `supplier`.`supp_id`
AND SelectedSuppliers.date_a = '2013-1-5'
通過首先從suppliers
選擇, 然后退出加入,您將獲得每個供應商行。
注意:通常(並且錯誤地)認為ON
子句可能僅具有與“鍵相關”的條件,但實際上它可能包含任何條件(甚至與被連接的表都不相關!)
使用此表格
SELECT A1,A2,...
FROM TABLE1,TABLE2,TABLE3,....
WHERE ......
注意:從表名稱中創建一個笛卡爾積,其中所有值都可以通過指定where子句從中選擇。
無論您要輸入is_selected列中的任何信息以了解該信息是否已提供,都將在您的where條件下使用。 假設默認情況下為0(如果未選中),並且希望加載這些記錄,則只需將其放置where SelectedSuppliers.is_selected = 0
尚不清楚為什么要引用shop_list
,當該表或別名未出現在查詢中時,或者為什么其中一個表名包含尾隨空格,
根據您的描述,我認為您希望supplier
位於LEFT JOIN的左側(以返回Supplier表中的所有行。
(我shop_list
的引用替換為對SelectedSuppliers
的引用。我在表名上留下了尾隨空格,就像在示例查詢中一樣。)
SELECT s.supp_id
, s.supp_name
, s.address
, s.supp_code
, e.is_selected
FROM `supplier` s
LEFT
JOIN `SelectedSuppliers ` e
ON e.supplier_id = s.supp_id
AND e.date_a = '2013-1-5'
所有行都將從左側的表(在此查詢中為supplier
)返回,而右側表的所有匹配行都將返回。
如果SelectedSuppliers表中沒有匹配的行,則is_selected
in的值將為NULL。 如果需要,可以通過將其包裝在IFNULL函數中輕松地將其替換為0。
如果您打算排除已經選擇的供應商,我們可以向查詢添加一個簡單的謂詞以消除匹配的行:
WHERE e.supplier_id IS NULL
這將返回supplier
行,其中SelectedSuppliers
表中沒有匹配的行,
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.