我有两张桌子:
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
有没有办法实现这一目标,还是有更好的数据库设计?
(如果有人对这个问题有更好的称号......请随意)
答案 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