2011-11-07 13 views
0

2つのテーブルからデータを取得しようとしているSQL文に、first_assistと2nd_assistの行であるplayer_idの行を数え、それに応じて3列で表示しようとしています。2つのテーブルから引き出されたネストされたSQL文

ここに私のコードです。

SELECT 

    last_name, 

    (SELECT COUNT (*) FROM goals WHERE player_id = 4 OR player_id = 5) 
    AS player_goals, 

    (SELECT COUNT (*) FROM goals WHERE 1st_assist = 4 OR 1st_assist = 5) 
    AS 1st_assists, 

    (SELECT COUNT (*) FROM goals WHERE 2nd_assist = 4 OR 2nd_assist = 5) 
    AS 2nd_assists 

FROM people 

WHERE player_id = 4 OR player_id = 5 

GROUP BY player_id 
+3

質問は何ですか?エラーは何ですか?何が起こるか/あなたは何が起こると思いますか? – Marcus

+0

エラーは "#1064 - あなたはSQL構文に誤りがあります;あなたのMySQLサーバーバージョンに対応するマニュアルをチェックして、正しい構文が '*)FROMの目標where player_id = 4またはplayer_id = 5' AS player_goals、 'at line 5」 –

+0

私が望むのは、私がテーブルから探しているものを得るSQL文を持つことです。つまり、私がトップに書いたものです。 3つの列を取得して、プレーヤーIDが4または5の行の数を追加しようとしています。 –

答えて

0

これを試してみてください:

テスト済み
SELECT 
    p.last_name, 
    COUNT(DISTINCT g.id) AS player_goals, 
    COUNT(DISTINCT a1.id) AS 1st_assists, 
    COUNT(DISTINCT a2.id) AS 2nd_assists 
FROM 
    people p 
    LEFT JOIN goals g ON (g.player_id = p.player_id) 
    LEFT JOIN goals a1 ON (a1.1st_assist = p.player_id) 
    LEFT JOIN goals a2 ON (a2.2nd_assist = p.player_id) 
WHERE 
    p.player_id = 4 OR p.player_id = 5 
GROUP BY p.player_id 


mysql> select * from people; 
+-----------+-----------+------------+ 
| player_id | last_name | first_name | 
+-----------+-----------+------------+ 
|   4 | Francis | Jeff  | 
|   5 | Doe  | John  | 
|   6 | Barratt | Glen  | 
+-----------+-----------+------------+ 
3 rows in set (0.00 sec) 

mysql> select * from goals; 
+----+-----------+------------+------------+---------------------+ 
| id | player_id | 1st_assist | 2nd_assist | when_made   | 
+----+-----------+------------+------------+---------------------+ 
| 1 |   4 |   6 |   5 | 2011-11-07 15:05:31 | 
| 2 |   4 |   5 |  NULL | 2011-11-07 15:05:37 | 
| 3 |   5 |   4 |   6 | 2011-11-07 15:05:45 | 
| 4 |   6 |   4 |   5 | 2011-11-07 15:05:52 | 
| 5 |   4 |   6 |  NULL | 2011-11-07 15:06:05 | 
| 6 |   5 |  NULL |  NULL | 2011-11-07 15:06:15 | 
| 7 |   6 |   4 |  NULL | 2011-11-07 15:06:21 | 
| 8 |   5 |   6 |  NULL | 2011-11-07 15:06:31 | 
| 9 |   4 |  NULL |  NULL | 2011-11-07 15:15:21 | 
| 10 |   4 |   6 |  NULL | 2011-11-07 15:15:27 | 
| 11 |   6 |   5 |   4 | 2011-11-07 15:15:38 | 
+----+-----------+------------+------------+---------------------+ 
11 rows in set (0.00 sec) 

mysql> SELECT p.last_name, COUNT(DISTINCT g.id) AS player_goals, COUNT(DISTINCT a1.id) AS 1st_assists, COUNT(DISTINCT a2.id) AS 2nd_assists FROM people p LEFT JOIN goals g ON (g.player_id = p.player_id) LEFT JOIN goals a1 ON (a1.1st_assist = p.player_id) LEFT JOIN goals a2 ON (a2.2nd_assist = p.player_id) WHERE p.player_id = 4 OR p.player_id = 5 GROUP BY p.player_id; 
+-----------+--------------+-------------+-------------+ 
| last_name | player_goals | 1st_assists | 2nd_assists | 
+-----------+--------------+-------------+-------------+ 
| Francis |   5 |   3 |   1 | 
| Doe  |   3 |   2 |   2 | 
+-----------+--------------+-------------+-------------+ 
2 rows in set (0.00 sec) 
+0

私はあなたの例を使用しました。エラーが発生しました。「g.idは未知のフィールドです」したがって、動作させるために変更し、g.id、a1.id、a2.idをg.player_idに切り替えました、a1.1st_assist、次のようにa2nd_assist:人々のP FROM 2nd_assists AS 1st_assists、COUNT(DISTINCT a2.2nd_assist)AS player_goals AS SELECT p.last_name、COUNT(DISTINCT g.player_id)、COUNT(DISTINCT a1.1st_assist) LEFT JOINの目標をONにする(g.player_id = p.player_id) LEFT JOINの目標をa1にする(a1.1st_assist = p.player_id) LEFT JOINの目標をa2に設定する(a2.2nd_assist = p.player_id) どこにp.player_id = 4 OR p.player_id = 5 GROUP BY p.player_id –

+0

クエリが通過するように見えましたが、合計は正しい。私の合計は列全体でちょうど1だった。私は一度に1つずつクエリを実行して正しい合計を得ることができるのでデータベースが正しいことを知っていますが、一度に1つだけ、3つの列には分散しません。 他に何か行方不明になることがありますか?助けてくれてありがとう、私たちは大きな進歩を遂げていると思う。再度、感謝します。 –

+0

目標表の行を一意に識別する列は何ですか? idの代わりに使うべき列です。おそらくそれはgoal_idですか? – ghbarratt

関連する問題