我有两个表:
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
有没有办法实现这一点,或者有更好的数据库设计吗?
(如果有人对这个问题有更好的标题......请随意)
最佳答案
假设您想要忽略参数 a > 10(完全)的用户,这将获得包含该示例数据的一行的预期输出:
fiddle 测试: 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 时返回,但仍然显示用户的其他参数,您可能需要:
fiddle 测试: 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,而 Ted 的参数 a 的值 27 会被返回,因为 27 > 10,并且无论如何都会返回 b 和 c 的值)
关于mysql - 如何从给定行条件的表中选择所有行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25950699/