簡體   English   中英

如何聯接兩個表並僅獲取特定記錄

[英]How to join two tables and get specific records only

如何聯接兩個表並僅獲取特定記錄?

我有兩張桌子

  1. 供應商-列( supp_idsupp_codesupp_nameaddress
  2. SelectedSuppliers -列( supplier_idis_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.

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