2013-11-26 206 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

相關問題