2016-05-11 9 views
1

MySQLクエリに問題があります。次のようにクエリは次のとおりです。falseを返すクエリ

SET @catlocation = (SELECT id FROM categories WHERE url_name='hexcode'); 

SELECT 
subs.display_name AS display, 
subs.url_name AS url, 
(
    SELECT title 
    FROM threads 
    WHERE location = subs.id 
    ORDER BY time_submitted DESC 
    LIMIT 1 
) AS title, 
( 
    SELECT username 
    FROM users 
    WHERE uid = (
     SELECT uid 
     FROM threads 
     WHERE location = subs.id 
     ORDER BY time_submitted DESC 
     LIMIT 1 
    ) 
    LIMIT 1 
) AS author, 
(
    SELECT COUNT(*) 
    FROM threads 
    WHERE location = subs.id 
    ORDER BY time_submitted DESC 
    LIMIT 1 
) AS thread_count 

FROM ( 
    SELECT * 
    FROM categories 
    WHERE parent_id = @catlocation 
) AS subs 

私はPHPを介してこれを実行しようとすると、私は偽の結果を得るのエラー:場合

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'SELECT subs.display_name AS display, subs.url_name AS url, (SELECT threads.' at line 7

私は、構文エラーが何ができるかわかりません誰かがそれを私に指摘してくれれば素晴らしいだろう。

EDIT:これは、あなたがそこにある場合は、各テーブルのタグを宣言したり、それを省略する必要があるのANSI SQLでは2つの選択ステートメント(?@catlocationを設定し、1とメイン・クエリ)

+2

MySQLのコメントは、 '--'ではなく'# 'を使用してください。 –

+0

すべてのコメントを削除しても、エラーは引き続き発生します。 – Harry

+0

これは複数のクエリに見えますか?!?!? – Strawberry

答えて

1

パフォーマンスを向上させるために結合を使用してリクエストをリファクタリングすることができます。

SELECT s.display_name display, s.url_name url, 
     t1.title, u.username author, 
     COUNT(t2.title) total 
FROM categories s 
LEFT JOIN threads t1 ON t1.id = (SELECT id FROM threads 
           WHERE location = s.id 
           ORDER BY time_submitted DESC 
           LIMIT 1) 
LEFT JOIN users u ON u.uid = t1.uid 
LEFT JOIN threads t2 ON t2.location = s.id 
WHERE s.parent_id = @catlocation 
GROUP BY s.display_name, s.url_name, t1.title, u.username 
+0

私はこのコードを使用したときにエラーが発生しました。私はJOINSを使用していないので、なぜ動作していないのか分かりません。 エラー:近くに構文エラー:[OK]をライン5 – Harry

+0

で「 ( SELECTタイトル、場所は= オードをs.idスレッド FROM UIDを登録しよう」、私はポストを編集し – ebahi

+0

申し訳ありませんが、私は、要求のエラーを見て、私は修正しました – ebahi

1

を持つことによって引き起こされる可能性が唯一。 「スレッド」を取り出してみてください。どこでも必要ありません。

+0

どこからでも 'threads'を削除しました。変更はありません – Harry

+0

うわー、エラーメッセージは変わったのですか? – Ian

+0

少し変わって、同じ場所とラインが変わった。それはちょうど 'スレッドの削除によって反映されました。 – Harry

1

@catlocationを設定した最初のSELECT文が問題を引き起こしています。私は、サブクエリにそれを移動し、クエリは新しいクエリが以下のとおりである

正常に実行されました:

SELECT categories.display_name display, 
     categories.url_name url, 
     threads.title title, 
     users.username author, 
     (SELECT COUNT(title) 
     FROM threads 
     WHERE location = categories.id 
     ) total 
FROM categories 

LEFT JOIN threads 
ON threads.tid = (SELECT tid 
        FROM `threads` 
        WHERE location = categories.id 
        ORDER BY time_submitted DESC 
        LIMIT 1) 

LEFT JOIN users ON users.uid = threads.uid 

WHERE categories.parent_id = (SELECT id 
           FROM `categories` 
           WHERE url_name='hexcode' 
           LIMIT 1); 

私はJOINを使用してクエリをリファクタリングしていきますが(かつて私はそれらを使用する方法を学びます)。すべての提案された修正のおかげで、私はJOINの答えを理解していないし、それでもエラーなしで実行することができませんでした。

関連する問題