[英]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.