我使用四个表:
- 查询
- 商店
- cluster_group
- 电视区域
我想检索属于特定电视区域记录的查询记录。
查询记录属于存储或cluster_group表中的记录。查询表具有"store_id"one_answers"cluster_group_id"列。其中一个将为null,而另一个将引用存储或cluster_group表中的记录。store和cluster_group表都有一个"tv_region_id"列。
为了检索属于id为2的电视区域记录的查询记录,我编写了以下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;
问题是,即使存在属于指定电视区域的查询记录(通过集群组或存储记录),它也返回零记录。我可能误解了"内部联接"的工作原理。
我正在使用Doctrine2,并尝试使用左联接进行查询,但它仍然没有返回任何结果,我想这是因为它也返回了null值。如何让它只返回我感兴趣的查询记录,而不返回null值?
如果有人能为我指明正确的方向来检索相关的查询记录,我将不胜感激。
您将需要使用OUTER联接,或者可能使用LEFT
INNER联接将只返回两边都有匹配记录的数据。正如你在问题中所说,你只在一方或另一方得到了匹配,因此商店和集群永远不会有匹配的记录
Jeff Atwood在他的博客上很好地解释了连接类型http://www.codinghorror.com/blog/2007/10/a-visual-explanation-of-sql-joins.html
试试这个:-
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
对我来说是这样的:
from table1 inner join table2 on table1.id = table2.id
inner join table3 on table1.id = table3.id