如何连接两个表并仅获取特定记录

时间:2013-01-28 05:48:59

标签: mysql

如何连接两个表并仅获取特定记录?

我有两张桌子

  1. 供应商 - 专栏(supp_idsupp_codesupp_nameaddress
  2. SelectedSuppliers - 列(supplier_idis_selected,date_a)
  3. 我将所有供应商加载到网格视图,并通过复选框选择特定供应商

    对于来自供应商表的特定日期,它将转到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个记录而不是所有记录

    感谢。

5 个答案:

答案 0 :(得分:2)

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'

请查看图片enter image description here

答案 1 :(得分:1)

只需撤消连接顺序并将条件移到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子句可能只有“关键相关”条件,但实际上它可能包含任何条件(即使与加入的表无关的条件!)

答案 2 :(得分:0)

使用此表单

SELECT A1,A2,...
FROM TABLE1,TABLE2,TABLE3,....
WHERE ......

注意:从表名创建一个笛卡尔积,其中包含您通过指定where子句选择的所有值。

答案 3 :(得分:0)

您在is_selected列中输入的任何信息,以了解是否已提供该信息,以及在您的where条件中使用该信息。假设默认情况下它为0(如果未选中)并且您希望加载这些记录,那么只需添加where SelectedSuppliers.is_selected = 0

答案 4 :(得分:0)

当您的查询中没有显示该表或别名,或者为什么您的某个表名包含尾随空格时,为什么您有shop_list的引用并不清楚?

根据您的描述,我认为您希望supplier位于LEFT JOIN的左侧(从供应商表中返回所有行。

(我将对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 

这将返回supplierSelectedSuppliers表中没有匹配行的行,