MySQL内部联接涉及三个表



我使用四个表:

  • 查询
  • 商店
  • 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

相关内容

  • 没有找到相关文章