0

次のクエリを作成しました。

(選択する
    privatemsgs.id、
    privatemsgs.useradn、
    privatemsgs.useraid、
    privatemsgs.title、
    privatemsgs.created、
    privatemsgs.timee、
    privatemsgs.isread、
    u.photo AScreatorphoto、
    privatemsgs.relatedto
FROM privatemsgs
左参加
    ユーザーASuON(privatemsgs.useraid = u.id)
WHERE userbid = '5'
    AND relatedto=0およびbdel=1)
ユニオンオール
(選択する
    privatemsgs.id、
    privatemsgs.useradn、
    privatemsgs.useraid、
    privatemsgs.title、
    privatemsgs.created、
    privatemsgs.timee、
    privatemsgs.isread、
    u.photo AScreatorphoto、
    rel.relatedto
FROM privatemsgs AS rel
    JOIN privatemsgs ON(rel.relatedto = privatemsgs.id)
    左参加
    ユーザーASuON(rel.useraid = u.id)
WHERE rel.userbid = '5')
GROUP BY ID
時間で注文DESC

このクエリは、テーブルからすべてのPrivatemsgsを選択し、メールのように動作します。

ユーザーbにメッセージを送信し、ユーザーbが応答した場合。各ユーザーの受信トレイと送信トレイにメッセージを表示したい。

メインメッセージのIDに「関連」としてマークされたプライベートメッセージへのコメント。

クエリは機能しますが、表示されているメッセージを複製します(同じメッセージが何度も表示されます)。修正するために「GROUPBY id」を実行しようとしましたが、エラーが発生しました。

#1064-SQL構文にエラーがあります。'GROUP BY id ORDER BY timee DESC'の近くで使用する正しい構文については、MySQLサーバーのバージョンに対応するマニュアルを確認してください。

ありがとうございました!!

4

1 に答える 1

0

まず、PM 77 のコメントによると、すべてのユニオンではなくユニオンが重複の問題を解決します。group by 句はまったく必要ありません。

次に、論理エラーが発生している可能性があります。あなたのユニオンクエリの一番上にはこれがあります:

FROM privatemsgs 
LEFT JOIN
users AS u ON(privatemsgs.useraid = u.id)
WHERE userbid='5'
AND relatedto=0 and bdel=1)

where 句のフィールドのいずれかが users テーブルにある場合、左結合は内部結合になります。左結合のままにしておくには、次のようにすべてのフィルターを結合に入れる必要があります。

FROM privatemsgs 
LEFT JOIN
users AS u ON privatemsgs.useraid = u.id
AND userbid='5'
AND relatedto=0 and bdel=1)
于 2013-03-17T03:11:16.453 に答える