MySQL中的子查询创建重复的结果

时间:2011-09-08 15:11:19

标签: mysql select

我的查询有点麻烦。

正如您所看到的,我正在运行两个查询。这一切看起来都很好,而mysql就像男人一样。但我得到的结果是相同的5倍。

SELECT s.category_id, p.product_id
FROM (    
    SELECT ros_categories.category_id
    FROM ros_categories, ros_variantIndex
    WHERE ros_categories.name = ros_variantIndex.variantText
    AND ros_categories.group = 'Sizes'
    LIMIT 0 , 5
) s, (    
    SELECT ros_product.product_id
    FROM ros_product, ros_variantIndex
    WHERE ros_product.vart = ros_variantIndex.vart
    LIMIT 0 , 5
) p

输出:

+-------------+------------+
| category_id | product_id |
+-------------+------------+
|         110 |          1 |
|           7 |          1 |
|           8 |          1 |
|           9 |          1 |
|          10 |          1 |
|         110 |          1 |
|           7 |          1 |
|           8 |          1 |
|           9 |          1 |
|          10 |          1 |
|         110 |          1 |
|           7 |          1 |
|           8 |          1 |
|           9 |          1 |
|          10 |          1 |
|         110 |          1 |
|           7 |          1 |
|           8 |          1 |
|           9 |          1 |
|          10 |          1 |
|         110 |          1 |
|           7 |          1 |
|           8 |          1 |
|           9 |          1 |
|          10 |          1 |
+-------------+------------+
25 rows in set (0.01 sec)

这里发生了什么?这是我的问题还是mysql很奇怪?

编辑:

感谢您解释我的问题所在。我用几个连接修复了它。所以,谢谢你指出我的错误并命名问题:-)并抱歉回答这个愚蠢的问题

2 个答案:

答案 0 :(得分:2)

  

这里发生了什么?这是我的问题还是mysql很奇怪?

您所做的就是创建一个笛卡尔积,也称为Cross Join。通常你只是加入s和p来获得你想要的东西,但是JOIN标准并不清楚。

也许你想要这个(猜测你桌子上的列)

SELECT s.category_id, p.product_id
FROM (

SELECT ros_categories.category_id
FROM ros_categories, ros_variantIndex
WHERE ros_categories.name = ros_variantIndex.variantText
AND ros_categories.group = 'Sizes'
LIMIT 0 , 5
)s
 INNER JOIN  (

SELECT ros_product.product_id, ros_product.category_id
FROM ros_product, ros_variantIndex
WHERE ros_product.vart = ros_variantIndex.vart
LIMIT 0 , 5
)p
on s.category_id = p.category_id

答案 1 :(得分:0)

它只是两个临时表的叉积,表示子查询的相应结果集。