0

私は2つのテーブルを持っています

table 1                             table 2
id   q_id   content                 id    w_id     q_id    c_id    ranking
----------------------          ------------------------------------------------
95   2046   1=E                     123   22404    2046    100     0
96   2046   2=G                     124   22404    2046    101     1
97   2046   3=N                     125   22404    2046    102     1
98   2046   4=B                     126   22404    2046    103     1
99   2046   5=V                     127   22404    2046    104     2
100  2046   A1                      128   22404    2046    105     2
101  2046   A2                      129   22505    2046    A1      0
102  2046   A3                      130   22505    2046    A2      2
103  2046   A4                      131   22505    2046    A3      1
104  2046   A5                      132   22505    2046    A4      2
105  2046   A6                      133   22505    2046    A5      3
106  2046   A7                      134   22505    2046    A6      3
-----------------------             135   22505    2046    A7      0

この形式で実行したい(sdはここでは計算しませんでした)

id     content     av     total     E     G     N     B     V     sd
----------------------------------------------------------------------
100      A1        1        2       2     0     0     0     0      0
101      A2       1.5       2       0     1     1     0     0      0
102      A3        1        2       1     1     0     0     0      0
103      A4        2        2       0     2     0     0     0      0
104      A5        3        2       0     0     2     0     0      0
105      A6        3        2       0     0     2     0     0      0
106      A7        3        1       0     0     1     0     0      0

マークの提案に基づいて修正されたコード:

SELECT *
FROM table_1 t1
JOIN table_2 t2 ON t2.c_id in (t1.id, t1.content)
WHERE t1.q_id = 2046 AND 
  t2.q_id = 2046 AND 
  t2.ranking >= 0 AND 
  t2.w_id IN (22404, 22505) 
GROUP BY t1.id

結果:

id    q_id    content    w_id    c_id    ranking
-------------------------------------------------------
100   2046    A1         22404    100      0
101   2046    A2         22404    101      1
102   2046    A3         22404    102      1
103   2046    A4         22404    103      1
104   2046    A5         22404    104      2
105   2046    A6         22404    105      2
106   2046    A7         22505    A1       1

行 106 の c_id は A1 ではなく A7 である必要があり、ランキングも間違っています。私は20行(A1-A20)を持っているので。A7~A20の行が間違っています。A7~A20のc_idと順位が全てA1と1になりました。

4

1 に答える 1

0

Noel によって特定された解決策に加えて、id ではなく table_1 のコンテンツに一致する c_id で 22505 レコードを結合する必要があるように見えること、不要な結合があり、既存のクエリで暗黙的結合と明示的結合が混在していることにも言及する価値があります。代わりに、これを試して:

SELECT t1.id, 
       t1.content,
       AVG(t2.ranking+1) AS av, 
       COUNT(t2.w_id) AS total, 
       COUNT(IF(ranking=0,1,NULL)) AS E,
       COUNT(IF(ranking=1,1,NULL)) AS G, 
       COUNT(IF(ranking=2,1,NULL)) AS N, 
       COUNT(IF(ranking=3,1,NULL)) AS B,
       COUNT(IF(ranking=4,1,NULL)) AS V, 
       STDDEV(ranking) AS sd
FROM table_1 t1
JOIN table_2 t2 ON t2.c_id in (t1.id, t1.content)
WHERE t1.q_id = 2046 AND 
      t2.q_id = 2046 AND 
      t2.ranking >= 0 AND 
      t2.w_id IN (22404, 22505) 
GROUP BY t1.id

ここでSQLFiddle 。

于 2013-05-06T10:16:11.083 に答える