我正在处理四张桌子:
我想检索属于特定TV区域记录的查询记录。
查询记录要么属于存储区中的记录,要么属于cluster_group表。查询表中有“store_id”和“cluster_group_id”列。其中一个将为null,另一个将引用存储区或cluster_group表中的记录。商店表和cluster_group表都有一个'tv_region_id‘列。
为了检索属于具有id = 2的TV区域记录的查询记录,我编写了以下SQL语句:
SELECT query.id AS query_id, cluster_group.name as cluster_name, cluster_group.tv_region_id as cluster_tv_region, store.store_name
FROM query
INNER JOIN cluster_group
ON cluster_group.id=query.cluster_group_id
INNER JOIN store
ON store.id=query.store_id
WHERE cluster_group.tv_region_id = 2
AND store.tv_region_id = 2;问题是,即使存在属于指定TV区域的查询记录(通过群集组或存储记录),它仍然返回零条记录。我可能误解了“内部连接”是如何工作的。
我正在使用Doctrine 2,并尝试使用左联接进行查询,但它仍然没有返回任何内容,我猜这是因为它也返回空值。如何使它只返回我感兴趣的查询记录,而不返回空值?
感谢有人能为我指出正确的方向来检索相关的查询记录。
发布于 2014-02-11 16:17:12
您将需要使用外部联接,或者可能是左边。
内部联接只返回双方都有匹配记录的数据。正如您在问题中所述,您只得到一方或另一方的匹配,因此在存储和集群中永远不会有匹配的记录。
Jeff在他的博客http://www.codinghorror.com/blog/2007/10/a-visual-explanation-of-sql-joins.html中很好地解释了连接类型
发布于 2014-02-11 16:21:05
试试这个:-
SELECT query.id AS query_id, cluster_group.name as cluster_name, cluster_group.tv_region_id as cluster_tv_region, store.store_name
FROM query
LEFT OUTER JOIN cluster_group
ON cluster_group.id=query.cluster_group_id
AND cluster_group.tv_region_id = 2
LEFT OUTER JOIN store
ON store.id=query.store_id
AND store.tv_region_id = 2编辑-没有教条的经验,但你可以尝试使用联盟:-
SELECT query.id AS query_id, cluster_group.name as cluster_name, cluster_group.tv_region_id as cluster_tv_region, NULL AS store_name
FROM query
INNER JOIN cluster_group
ON cluster_group.id=query.cluster_group_id
AND cluster_group.tv_region_id = 2
UNION
SELECT query.id AS query_id, NULL as cluster_name, NULL as cluster_tv_region, store.store_name
FROM query
INNER JOIN store
ON store.id=query.store_id
AND store.tv_region_id = 2发布于 2014-07-12 09:33:41
对我来说是这样的:
from table1 inner join table2 on table1.id = table2.id
inner join table3 on table1.id = table3.idhttps://stackoverflow.com/questions/21707140
复制相似问题