MySQL Inner Join涉及三个表

时间:2014-02-11 16:15:02

标签: php mysql join doctrine-orm inner-join

我正在使用四个表:

  • 查询,
  • 存储,
  • cluster_group,
  • tv_region

我想检索属于特定电视地区记录的查询记录。

查询记录或者属于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 并使用左连接尝试查询,但它仍然没有返回任何内容,我想这是因为它也返回了空值。如何让它只返回我感兴趣的查询记录而没有空值?

感谢有人能指出我正确的方向来检索相关的查询记录。

3 个答案:

答案 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