我有一个问题,但我真的不知道如何问它!请多多包涵:
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')
Run Code Online (Sandbox Code Playgroud)
为了解释上述情况,我们在一个名为"shipping_code"的表格中提供了运送(交付)代码,并且,由于我们有一个多语言网站,我们在"shipping_code_description"中有另一个表格来描述这些代码的语言.我们还有一个名为"site_international"的表格,其中包含以下字段:'siteid'(网站的ID - 例如英国,DE,FR ..(英语,德语,法语..)和'已发布'(布尔字段,即是网站是否有效?)
上面的SELECT查询获取所有发货代码,仅包含这些发布网站的语言描述.
现在,我们还想知道哪些运输代码在某些站点中没有描述.如果运输代码是全新的,那么将为该代码返回1行(因为LEFT OUTER JOIN).'scd.siteid'和'scd.desc_frontend'将为NULL.
但是,如果存在英国(英语)站点的描述,但不存在FR和DE的描述,则上述查询将返回一行,而不是三行.如何判断特定运输代码缺少DE和FR描述?
以下是我的选择:
1)我可以在一个查询中以某种方式完成这一切.必须有一种方法(我之前从未使用过UNION,EXCEPT等,我不确定这些是否应该使用).
2)或者我可以简单地做另一个查询来选择siteid FROM site_international WHERE published ='t'
以上将给我所有发布的网站.然后,使用PHP(我用来编码我的网站),对于上面较大的查询的每个结果,我会检查并查看是否缺少任何描述.例如,上面的siteid查询将返回3个ID(UK,DE,FR).然后,如果特定的货运代码只返回一个英国行,我就知道缺少DE和FR,我可以将其标记给我的客户.
请告知是否存在更好的选项"1"?
非常感谢!
bar*_*rit 39
也许我不明白你的问题,但如果你想得到"在另一个表中没有匹配的表中的条目",我可以给你一个简单的片段.
从左表中选择不在右表中的所有行.
SELECT l.*
FROM t_left l
LEFT JOIN t_right r
ON r.value = l.value
WHERE r.value IS NULL
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
19206 次 |
| 最近记录: |