2013-11-26 66 views
0

鉴于下面的表结构,如何仅为具有给定名称和user_id的行选择具有相同根和级别值的行?选择具有相同列值的行

Category 
    +----+---------+------+------+-------+ 
    | id | user_id | name | root | level | 
    +----+---------+------+------+-------+ 
    | 1 |  10 | wzq | 1 |  1 | 
    | 2 |  11 | xyz | 2 |  1 | 
    | 3 |  10 | xyz | 2 |  2 | 
    | 4 |  10 | xyz | 2 |  2 | 
    +----+---------+------+------+-------+ 

什么我现在也选择不具有相同的根和水平

SELECT `c`.`id`, `c`.`user_id`, `c`.`name`, `c`.`root`, `c`.`level` 
FROM `category` `c` 
WHERE c.id IN (SELECT d.id FROM category AS d WHERE c.root=d.root AND c.level=d.level) AND c.user_id = 10 AND c.name = 'xyz' 
ORDER BY `c`.`id` 

对于上面的例子只是第3和第4行应退还

+3

它会帮助,如果你能后的预期成果。 –

+0

你能举一个例子你的预期输出应该是什么? –

+0

所有user_ids(和名称)都是相同的。那是故意的吗? – Strawberry

回答

1

试试这个行对于只选择具有相同根和级别的行只是root=level

SELECT `id`, `user_id`, `name`, `root`, `level` 
FROM `category` 
WHERE root=level AND user_id = 10 AND `name` = 'xyz' 
ORDER BY `id` 
+0

好吧,这是一种解释! – Strawberry

+0

这是返回第一行,因为OP的描述应该只返回第3和第4个,请参阅[this](http://www.sqlfiddle.com/#!2/0d89e/4) –

+0

我同意,OP的例子非常混乱。但这不是他们的意思。 – Strawberry

0

试试这个:

SELECT * 
FROM 
(
    SELECT root, level 
    FROM category 
    WHERE name = 'xyz' AND user_id = 10 
) x JOIN category c ON x.root = c.root 
1
SELECT x.* 
    FROM my_table x 
    JOIN my_table y 
    ON y.user_id = x.user_id 
    AND y.root = x.root 
    AND y.level = x.level 
    AND y.id <> x.id 
WHERE x.user_id = 10 
+0

这会返回重复项,添加DISTINCT可能是正确答案 – Shakur