SELECT 具有相同 ID 的行使用不同的 ID 作为条件?

SELECT rows with same id using different id as condition?

我有以下 table:

+----+-------------+-----------------+-----------+----------------+
| 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       |
+-----------------------------------------------------------------+

我试过这个查询,但它只 returns 等于 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,这基本上是我需要的,但后来我得到了单独的列,我需要像上面那样组合它们。

您首先需要从 category_id = 133 所在的 table 获取 link_ids,然后查询 table 以获取包含该 link_id 的所有行.

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

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

您也应该可以使用 "self join" 执行此操作:

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

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