2014-09-20 43 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

相關問題