使用不同的id作为条件选择具有相同id的行?

时间:2015-09-03 21:14:08

标签: mysql subquery

我有下表:

+----+-------------+-----------------+-----------+----------------+
| id | link_id[FK] | category_id[FK] | parent_id[FK] | sort_order |
+----+-------------+-----------------+-----------+----------------+
| 1       2             1                 1               1       |
| 2       2             133               1               2       |
| 3       3             2                 2               1       |
| 4       3             200               2               2       |
| 5       3             333               200             3       |
| 6       4             1                 1               1       |
| 7       5             3                 3               1       |
| 8       5             133               3               2       |
| 9       5             223               133             3       |
| 10      5             456               223             4       |
+-----------------------------------------------------------------+

我需要SELECT具有相同link_id的所有行,但使用category_id作为条件。所以这是我正在寻找的示例结果。

+----+-------------+-----------------+-----------+----------------+
| id | link_id[FK] | category_id[FK] | parent_id[FK] | sort_order |
+----+-------------+-----------------+-----------+----------------+
| 1       2             1                 1               1       |
| 2       2             133               1               2       |
| 7       5             3                 3               1       |
| 8       5             133               3               2       |
| 9       5             223               133             3       |
| 10      5             456               223             4       |
+-----------------------------------------------------------------+

我已尝试此查询,但它只返回等于category_id 133的行。

SELECT *
FROM table a
WHERE (a.object_id,a.category_id) IN (
    SELECT b.link_id,b.link_id
    FROM table b
    WHERE b.category_id = 133
    AND a.link_id = b.link_id

) ORDER BY a.sort_order 

我也尝试过SELF JOIN,这基本上就是我需要的,但后来我得到了单独的列,我需要像上面那样组合它们。

1 个答案:

答案 0 :(得分:0)

首先需要从link_id的表格中获取category_id = 133,然后在表格中查询具有该link_id的所有行。

SELECT * FROM `table`
WHERE link_id IN (
    SELECT link_id FROM `table`
    WHERE category_id = 133
)
ORDER BY link_id, sort_order

DEMO:http://sqlfiddle.com/#!9/67eb4/5

你也应该能够通过“自我加入”来做到这一点:

SELECT a.* FROM `table` a
JOIN `table` b ON a.link_id = b.link_id
WHERE b.category_id = 133
ORDER BY a.link_id, a.sort_order

DEMO:http://sqlfiddle.com/#!9/67eb4/6