如何连接两个表并仅获取特定记录?
我有两张桌子
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
个记录而不是所有记录
感谢。
答案 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'
请查看图片
答案 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
这将返回supplier
中SelectedSuppliers
表中没有匹配行的行,