如果一行匹配条件,则获取外键的所有行

时间:2014-02-28 08:55:30

标签: mysql sql

我有两张表profileprops

profile.IDprops中包含其他列的外键。

我需要使用条件查询表props,但返回所有与满足条件的行具有相同外键的行。

示例:

+---------------------+
|ID  |  name  | value |
+---------------------+
|1   |  eng   | 60    |
|1   |  mat   | 70    |
|1   |  sci   | 80    |
|2   |  eng   | 90    |
|2   |  mat   | 40    |
|2   |  sci   | 50    |
|3   |  eng   | 70    |
|3   |  mat   | 40    |
|3   |  sci   | 50    |
+---------------------+

对于上表,如果我查询name = 'mat' AND value < 50,我会

+---------------------+
|ID  |  name  | value |
+---------------------+
|2   |  mat   | 40    |
|3   |  mat   | 40    |
+---------------------+

相反,我需要

+---------------------+
|ID  |  name  | value |
+---------------------+
|2   |  eng   | 90    |
|2   |  mat   | 40    |
|2   |  sci   | 50    |
|3   |  eng   | 70    |
|3   |  mat   | 40    |
|3   |  sci   | 50    |
+---------------------+

对于那些质疑目的的人,我正在尝试为配置文件实现动态属性;并且需要完整的归属列表以进一步过滤那些具有任何其他条件的列表。

2 个答案:

答案 0 :(得分:3)

SELECT *
  FROM props
  WHERE id IN
  (
     SELECT id
       FROM props
       WHERE name = 'mat' AND value < 50
  )

答案 1 :(得分:3)

您也可以使用INNER JOIN来完成此操作而不是WHERE id IN...语句:

SELECT  A.ID,
        A.Name,
        A.Value
  FROM  props A
    INNER JOIN (SELECT  ID
                  FROM  props
                  WHERE (Name = 'mat' AND value < 50)) B ON B.ID = A.ID 

因此,在B中获取符合条件的所有ID,然后只需将它们加入props表(别名A)。