SELECT sc.*,scd.siteid,scd.desc_frontend FROM shipping_code sc LEFT OUTER JOIN shipping_code_description scd ON scd.shippingid=sc.shippingid AND scd.siteid IN (SELECT siteid FROM site_international WHERE published='t')
为了解释上述情况,我们在一个名为“shipping_code”的表格中有发货(交货)代码,而且因为我们有一个多语言网站,所以我们在“shipping_code_description”中有另一个用于这些代码的语言描述表.
我们还有一个名为“site_international”的表,其中包含以下字段:’siteid'(网站ID,例如英国,德国,法国..(英文,德文,法文)和“已发布”(布尔字段,即网站是否活着?)
上述SELECT查询获取所有的运输代码,并且只有这些已发布站点的语言描述.
现在,我们也想知道哪些运输代码在某些网站上没有描述.如果发货代码是全新的,那么将为该代码返回1行(因为LEFT OUTER JOIN). ‘scd.siteid’和’scd.desc_frontend’将为NULL.
但是,如果存在英国(英文)网站的描述,但FR和DE的描述不存在,则上述查询将只返回一行,而不是三行.如何知道特定运输代码的DE和FR说明丢失?
这是我的选择:
1)我可以以某种方式在一个查询内完成这一切.一定有办法(以前从来没有使用过UNION,除了以前,我不知道这些是我应该使用的).
2)或者我可以简单地做另一个查询
SELECT siteid FROM site_international WHERE published =’t’
以上将给我所有出版的网站.然后,使用PHP(我用来代码我的网站),对于上述较大查询的每个结果,我会检查并查看是否缺少任何描述.例如.以上的siteid查询将返回3个ID(UK,DE,FR).那么如果一个特定的运输代码只返回一个英国行,我会知道DE和FR丢失,我可以把它标记给我的客户端.
请指示是否存在更好的选项“1”?
非常感谢!
选择左侧表格中不在右侧表格中的所有行.
SELECT l.* FROM t_left l LEFT JOIN t_right r ON r.value = l.value WHERE r.value IS NULL