MySQL-左连接显示的行数超出预期

时间:2012-07-03 17:43:53

标签: mysql left-join mysql-num-rows

我加入了两个 SELECTS 。第一个检索:

t1
id  value
1   149
2   149
3   149
4   149

第二个:

t2 
id  value
149 2
149 13
149 145
149 149

所以,我在t1.value = t2.id加入t1 / t2。但结果如下:

1   149 2
1   149 13
1   149 145
1   149 149
2   149 2
2   149 13
2   149 145
2   149 149
3   149 2
3   149 13
3   149 145
3   149 149
4   149 2
4   149 13
4   149 145
4   149 149

当期望的结果应如下所示:

1   149   2
2   149   13
3   149   145
4   149   149

我认为问题出现是因为这是 SELECT 而不是表格。经过谷歌搜索后,我找不到任何解决方案。

编辑:MySQL查询:

SELECT t1.id_sequence,t2.id_category, t2.tree
FROM
(
    SELECT * FROM (SELECT 1 AS id_sequence UNION SELECT 2 AS id_sequence UNION SELECT 3 AS id_sequence UNION SELECT 4 AS id_sequence ) as tbl1
    CROSS JOIN (SELECT DISTINCT id_catalog_category AS 'id_category' from catalog_category where id_catalog_category = 149) as tbl2
) as t1
LEFT JOIN 
(
    SELECT child.id_catalog_category AS id_category, ancestor.id_catalog_category AS tree
    FROM catalog_category AS child
    JOIN catalog_category AS ancestor
    ON (child.lft BETWEEN ancestor.lft AND ancestor.rgt)
    WHERE child.id_catalog_category = 149 AND ancestor.id_catalog_category != 1 
) as t2
ON t1.id_category = t2.id_category 

分别选择检索到的table1和table2。

2 个答案:

答案 0 :(得分:0)

Mysql基于VALUES加入ROWS,这与仅加入VALUES不同。

在您的数据集中,应该返回4 * 4行,这正是您所获得的,因此您的查询没有问题。你的期望是错误的。

例如:

t1的第一行:1 149 您可以看到您的连接匹配t2的所有行,因此返回了4行。对于t1的所有下一行,这是相同的,总共返回16个。

编辑:检查一下:

SELECT @rownum:=@rownum+1 as `id`, t2.* 
FROM (
    SELECT child.id_catalog_category AS id_category, ancestor.id_catalog_category AS tree
    FROM catalog_category AS child
    JOIN catalog_category AS ancestor
    ON (child.lft BETWEEN ancestor.lft AND ancestor.rgt)
    WHERE child.id_catalog_category = 149 AND ancestor.id_catalog_category != 1 
) as t2

答案 1 :(得分:0)

我认为您当前的结果是正确的。 举个例子,   假设t1中的id唯一地标识一个人&价值是他正在购物的沃尔玛商店。   假设t2中的id是Walmart store#,value是每个Walmart商店中所有商品的商品编号列表。

因此,每个人都可以从沃尔玛商店#149购买所有商品。 结论 - 你真的想做什么?