2017-06-21 23 views
0

我有一個mysql表是這樣的:複雜(或不可能)從MySQL表中選擇

Person  x  minutes  population 
p1   F  3   p1p2p3p4 
p2   B  1   p1p2p3p4 
p1   B  7   p1p2p3 
p3   F  2   p2p3p1 
p1   F  3   p1p2 
p1   B  4   p2p3p1 
p2   C  3   p1p2p3 
p2   B  1   p2p1p3 
p2   F  7   p2p3p4 
p3   B  2   p2p3p4 
p1   F  3   p2p1p3p4 

我需要什麼來選擇,每個Person是:

1計數次數X的數等於F;

2-計算x的次數等於B;

3-當person出現在變量​​中時的值minutes;

然後將所得select會是這樣:

Person nF nB tminutes 
p1  3  2  24 
p2  1  2  36 
p3  1  1  33 

我不知道這甚至有可能。我試過類似的東西:

SELECT 
Person, 
sum(x='F') as nF, 
sum(x='B') as nB, 
sum(minutes) WHERE population IS LIKE '%Person%' as tminutes 
FROM myTable 
GROUP BY Person 

任何想法都會非常受歡迎!謝謝。

+1

一個'SELECT'看起來幾乎是不可能的,通常是要告訴壞的數據庫設計。關係數據庫不是榮耀的CSV容器。建立一些實際的關係,你的SQL變得更容易。將「人口」欄目解析爲有意義的內容。 – Tomalak

+0

'人口'對我來說有意義。這將是沒有問題的:'SELECT總和(分鐘)作爲tminutes從myTable的人口LIKE'%p2%''。 – Javi

+1

我沒有說過它對你沒有任何意義。它對數據庫*沒有意義。它表示一個數據庫設計沒有表示的結構,這就是爲什麼你不能使用SQL(或者* efficient * SQL)來選擇它的原因。 – Tomalak

回答

2

您可以採用如下方案,使用子選擇:

SELECT 
    Person, 
    SUM(IF(x = 'F', 1, 0)) AS nF, 
    SUM(IF(x = 'B', 1, 0)) AS nB, 
    (SELECT SUM(minutes) FROM test_table WHERE INSTR(population, t1.Person) > 0) AS tminutes 
FROM test_table t1 
GROUP BY Person 

此查詢的結果是:

Person | nF | nB | tminutes 
--------------------------- 
p1  | 3 | 2 | 27 
p2  | 1 | 2 | 36 
p3  | 1 | 1 | 33 
+0

這是不正確的。前兩個'nF'和'nB'是正確的,儘管它們可以用更簡單的方式寫(如我的問題)。第三個變量'tminutes'與你寫'總和(分鐘)爲tminutes'相同,這不是我想要的。 – Javi

+0

看到我的更新。你的期望輸出也有一個錯誤:'p1'具有'27'分鐘而不是'24'。 –

+0

太好了。這工作完美。我現在接受你的答案。正如有人所說,這有點低效,大桌子需要很長時間。謝謝! – Javi