0

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

我有两张桌子

  1. 供应商 - 列 ( supp_id, supp_code, supp_name, address)
  2. SelectedSuppliers -- 列 ( supplier_id, is_selected, date_a)

我将所有供应商加载到网格视图并通过复选框选择特定供应商

对于供应商表中的特定日期,它会转到SelectedSuppliertable 。

当我从表中加载保存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记录而不是所有记录

谢谢。

4

5 回答 5

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'

请看一下图片在此处输入图像描述

于 2013-01-28T05:57:24.523 回答
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子句可能只有“键相关”条件,但实际上它可能包含任何条件(甚至与正在连接的表无关!)

于 2013-01-28T05:57:31.293 回答
0

使用此表格

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

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

于 2013-01-28T05:53:56.653 回答
0

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

于 2013-01-28T06:03:03.217 回答
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),以及右侧表中的任何匹配行。

is_selected当 SelectedSuppliers 表中没有匹配的行时,in的值将为 NULL。如果需要,可以通过将其包装在 IFNULL 函数中轻松地将其替换为 0。

如果您的意图是排除已选择的供应商,我们可以在查询中添加一个简单的谓词来消除匹配的行:

WHERE e.supplier_id IS NULL 

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

于 2013-01-28T06:04:52.687 回答