如何在给定行条件的情况下从表中选择所有行?

时间:2014-09-20 16:07:35

标签: mysql sql

我有两张桌子:

    users
| id |  name  |
|----|--------|
| 0  |  Bob   |
| 1  |  Ted   |

        parameters
| id | parameter | value  |
|----|-----------|--------|
| 0  |     a     |   5    |
| 0  |     b     |   9    |
| 0  |     c     |   0    |
| 1  |     a     |   27   |
| 1  |     b     |   0    |

*parameters.id references users.id

不幸的是,规范化值的唯一方法是提供的形式。所有用户的参数都不一致,也不能是列。

我必须始终为每个用户选择所有参数及其值,但是我可能需要查询某些值的参数(同时仍然为用户抓取所有行。)

例如,我可能想要获取参数 a 的值大于10的所有参数。这将返回:

| id | name  |  parameters |  values  |
|----|-------|-------------|----------|
| 1  |  Ted  |      a,b    |   27,0   |

我可以从参数表中获取所有数据,但我不知道如何有条件地选择数据:

SELECT a.*, b.params, b.values
FROM users AS a
JOIN (
    SELECT id, GROUP_CONCAT(parameters) AS params, GROUP_CONCAT(value) AS values
    FROM parameters
    GROUP BY id
) b
ON a.id=b.id

有没有办法实现这一目标,还是有更好的数据库设计?

(如果有人对这个问题有更好的称号......请随意)

1 个答案:

答案 0 :(得分:1)

假设您想要忽略没有参数a>>的用户,这将获得具有该示例数据的一行的预期输出。 10(完全):

小提琴测试: http://sqlfiddle.com/#!2/d70d5/5/0

select p.id,
       u.name,
       group_concat(p.parameter) as params,
       group_concat(p.value) as vals
  from parameters p
  join users u
    on p.id = u.id
  join (select id
          from parameters
         where parameter = 'a'
           and value > 10) v
    on p.id = v.id
 group by p.id, u.name

但是,如果您希望参数a仅在超过10时返回,但仍然显示用户'其他参数无论如何,你会想要:

小提琴测试: http://sqlfiddle.com/#!2/d70d5/4/0

select p.id,
       u.name,
       group_concat(p.parameter) as params,
       group_concat(p.value) as vals
  from parameters p
  join users u
    on p.id = u.id
 where (p.value > 10 and p.parameter = 'a')
    or p.parameter <> 'a'
 group by p.id, u.name

(注意Bob没有返回参数a的值为5,因为5 <10而对于参数a的Ted值为27,因为27&gt; 10和b的值为b而返回无论如何都返回c