0

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

  • ユーザー
  • ピクチャー
  • メッセージ
  • 友達リクエスト

1 つのクエリで友達リクエストと新しいメッセージを取得しようとしています。うまく機能しますが、「friendsreuqests」に参加したままにすると、複数の行が表示されます。

これが私のクエリです:

SELECT username,
  f1.userid as reqId,
  m1.msg, m1.userid, 
  p1.picHash, p1.extension, UNIX_TIMESTAMP( m1.sent ) AS date
FROM users
  LEFT JOIN pictures p1 ON p1.userid = users.id
  LEFT JOIN messages m1 ON m1.contactid = users.id AND m1.delivered =0
  LEFT JOIN friendrequests f1 ON f1.contactid = users.id AND f1.delivered=0 AND f1.request =1
WHERE users.id =7
ORDER BY date ASC

これは MySQL の結果です。

Kungen  3     gregegerg     1    dc825b1c8a35593be4d172db7    jpg    1369839537
Kungen  12    gregegerg     1    dc825b1c8a35593be4d172db7    jpg    1369839537
Kungen  3     HEJH          1    dc825b1c8a35593be4d172db7    jpg    1369839540
Kungen  12    HEJH          1    dc825b1c8a35593be4d172db7    jpg    1369839540

ご覧のとおり、結果は 2 倍になります。この時点で2行だけ取得したい。2 つの新しいメッセージがあり、新しい友達のリクエストがない場合、それらの 2 行は NULL である必要があります。

4

4 に答える 4

2

1 つのクエリで友達リクエストメッセージを取得する場合、クエリにunion all. あなたのクエリはテーブル間の結合を行っています。これにより、友達リクエストに関する情報が追加のとして追加されます。追加の行でそれが必要です。

friends テーブルのどのフィールドが、あなたがリクエストしているフィールドに対応するのかわかりません。しかし、これは を使用したクエリの例ですunion all:

SELECT username, users.id as reqId, m1.msg, m1.userid, 
       p1.picHash, p1.extension, UNIX_TIMESTAMP( m1.sent ) AS date
FROM users LEFT JOIN
     pictures p1 ON p1.userid = users.id LEFT JOIN
     messages m1 ON m1.contactid = users.id AND m1.delivered =0 
WHERE users.id =7
union all
SELECT username, users.id as reqId, NULL, NULL, 
       NULL, NULL, UNIX_TIMESTAMP( f1.sent ) AS date
FROM users LEFT JOIN
     friendrequests f1
     ON f1.contactid = users.id AND f1.delivered=0 AND f1.request =1
ORDER BY date ASC
于 2013-05-29T15:38:59.783 に答える
1

あなたLEFT JOIN のように友達リクエストとメッセージの両方を取得すると、結果セットにメッセージ数×友達リクエスト数が表示されます。あなたの例では、2 つのリクエストと 2 つのメッセージがあり、(2*2=) 4 行になります。

おそらく、union代わりに a を使用することを検討する必要がありますか? を使用するunionと、フレンド リクエストごとに 1 行、メッセージごとに 1 行を取得できます。それはあなたのニーズにより適しているはずです。ただし、この例ではまだ 4 行 (2+2) になります。

于 2013-05-29T15:37:35.407 に答える
0

すべてのフィールドを含む句を追加するGROUP BYことは確かに役立ちますが、保持する 2 番目のフィールドの値 (3 または 12) を決定する必要があります。そのフィールドが異なる2つの行が常に存在することを確実に知っている場合は、両方MIN(m1.msg)を選択してMAX(m1.msg)

于 2013-05-29T15:36:04.517 に答える
0

問題は、最初の 2 つの結合の後、正しい場合に次のようになることです。

Kungen  gregegerg       1   dc825b1c8a35593be4d172db7   jpg     1369839537
Kungen  HEJH            1   dc825b1c8a35593be4d172db7   jpg     1369839540

次に、friendrequests テーブルにf1.contactid = users.id参加すると、両方のエントリでユーザー 3 と 12 の要求に参加し、ユーザー IDは次のようになります1

Kungen  3   gregegerg       1   dc825b1c8a35593be4d172db7   jpg     1369839537
Kungen  12  gregegerg       1   dc825b1c8a35593be4d172db7   jpg     1369839537
Kungen  3   HEJH            1   dc825b1c8a35593be4d172db7   jpg     1369839540
Kungen  12  HEJH            1   dc825b1c8a35593be4d172db7   jpg     1369839540

正しい結果を得るには、メッセージまたはタイムスタンプに接続するもので friendrequests テーブルに参加する必要があります。これは異なる唯一の列であるためです。

于 2013-05-29T15:42:38.047 に答える