2014-09-20 58 views
0

我有两个表:如何从给定条件的行中选择表中的所有行?

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 

不幸的是,标准化值的唯一方法是在提供的表格。参数对所有用户都不一致,并且不能是列。

我必须为每个用户选择所有参数和它们的值,但是我可能需要查询参数特定值(同时仍抓住所有行用户。)

例如,我可以想其中参数一个具有值的所有参数大于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

误读了问题 - nm! – user3791372 2014-09-20 16:14:19

回答

1

这会得到你想要忽略用户没有参数的假设下,一排与实例数据的预期输出, > 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 

但是如果你想要一个参数,只回来,如果超过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 

(注意如何不返回鲍勃对参数值为5,因为5 < 10而对于Ted的由于27> 10返回参数a的值27,并且b和c的值无关地返回)

+0

这会给用户ID 0,参数B,值9也是,这不是预期 – radar 2014-09-20 16:34:56

+0

@rajesh他从来没有说过应该发生什么与非a值,但如果他的预期输出是完整的,而不是一个示例行我想这会暗示,我会添加第二个版本,以防万一他想要前 – 2014-09-20 16:38:37

+0

谢谢。第一个例子似乎是我想要的。是的,我给出的例子是完整的。 – user1405177 2014-09-20 17:15:54

相关问题