我正在使用四个表:
我想检索属于特定电视地区记录的查询记录。
查询记录或者属于store或cluster_group表中的记录。查询表包含' store_id'和' cluster_group_id'列。两者都将为null,而另一个将引用store或cluster_group表中的记录。 store和cluster_group表都有一个' tv_region_id'列。
要检索属于id = 2的TV Region记录的查询记录,我编写了以下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;
问题在于,即使存在属于指定电视区域的查询记录(通过群集组或商店记录),它也会返回零记录。我可能误解了内心的加入方式。的工作原理。
我正在使用 Doctrine 2 并使用左连接尝试查询,但它仍然没有返回任何内容,我想这是因为它也返回了空值。如何让它只返回我感兴趣的查询记录而没有空值?
感谢有人能指出我正确的方向来检索相关的查询记录。
答案 0 :(得分:0)
您需要使用OUTER连接,或者可能使用LEFT
INNER联接只返回双方都有匹配记录的数据。正如您在问题中所述,您只能在一方或另一方获得匹配,因此在商店和集群中永远不会有匹配的记录
杰夫阿特伍德在他的博客http://www.codinghorror.com/blog/2007/10/a-visual-explanation-of-sql-joins.html
上对联接类型有一个很好的解释答案 1 :(得分:0)
试试这个: -
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
编辑 - 没有学说经验,但你可以尝试使用UNION: -
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
答案 2 :(得分:0)
它对我来说是这样的:
from table1 inner join table2 on table1.id = table2.id
inner join table3 on table1.id = table3.id