1

ここには 3 つのテーブルがあり、それらに対してトリッキーな複合クエリを実行しようとしています。

表 1(チーム) にはチームが含まれています。

id     name
------------
150    LA Lakers
151    Boston Celtics
152    NY Knicks

表 2(scores) にはスコアが含まれています。

id  teamid   week    score
---------------------------
1     150     5        75
2     151     5        95
3     152     5        112

テーブル 3(チケット) にはチケットがあります

id    teamids    week
---------------------
1   150,152,154   5   
2   151,154,155   5    

作成しようとしているクエリが 2 つあります。チケットをクエリするたびにこれらを合計しようとするのではなく、チケットに Weekly_score フィールドを追加しました。チームの新しいスコアが入力されるたびに、そのチーム ID を取得し、そのチーム / 週の組み合わせを持つすべてのチケットを取得し、チーム スコアの合計に基づいてすべてを更新することができます。

探している結果を取得するために、次のことを試しました(更新を試みる前に):

SELECT t.id, t.teamids, (
  SELECT SUM( s1.score ) 
  FROM scores s1
  WHERE s1.teamid
   IN (
    t.teamids
   )
 AND s1.week =11
) AS score
FROM tickets t
WHERE t.week =11
AND (t.teamids LIKE  "150,%" OR t.teamids LIKE  "%,150")

クエリが遅いだけでなく、スコアの合計が返されないようで、リストの最初のスコアが返されるだけです。

どんな助けでも大歓迎です。

4

3 に答える 3

0

ここにSUM関数は必要ありませんか?スコア表にはすでにそれがありますか?ところで、サブクエリを避け、左結合 (または必要に応じて左外部結合) を試してください。

SELECT t.id, t.name, t1.score, t2.teamids 
FROM teams t 
LEFT JOIN scores t1 ON t.id = t1.teamid AND t1.week = 11
LEFT JOIN tickets t2 ON t2.week = 11 
WHERE t2.week = 11 AND t2.teamids LIKE "%150%"

未検証。

于 2012-11-30T16:12:32.350 に答える
0

一致する場合は、チーム ID が 1 つだけの列に対応する必要があります。また、SELECT サブクエリで LIKE する必要があります。

SELECT t.id, t.teamids, (
  SELECT SUM( s1.score ) 
  FROM scores s1
  WHERE 
    (s1.teamid LIKE t.teamids 
        OR CONCAT("%,",s1.teamid, "%") LIKE t.teamids 
        OR CONCAT("%",s1.teamid, ",%") LIKE t.teamids
    )
    AND s1.week =11
) AS score
FROM tickets t 
WHERE t.week =11
AND (t.teamids LIKE  "150,%" OR t.teamids LIKE  "%,150" OR t.teamids LIKE "150")
于 2012-11-30T16:15:06.623 に答える
0

これまでで最も洗練されたクエリではありませんが、次のように表現する必要があります。

SELECT
  tickets.id,
  tickets.teamids,
  sum(score)
FROM
  tickets left join scores
  on concat(',', tickets.teamids, ',') like concat('%,', scores.teamid, ',%')
WHERE tickets.week = 11 and concat(',', tickets.teamids, ',') like '%,150,%'
GROUP BY tickets.id, tickets.teamids

またはこれも:

SELECT
  tickets.id,
  tickets.teamids,
  sum(score)
FROM
  tickets left join scores
  on FIND_IN_SET(scores.teamid, tickets.teamids)>0
WHERE tickets.week = 11 and FIND_IN_SET('150', tickets.teamids)>0
GROUP BY tickets.id, tickets.teamids

(詳細については、この質問と回答を参照してください)。

于 2012-11-30T18:46:13.287 に答える