0

テーブル「users」から 10 個のランダムな行を、テーブル「Profile_pictures」から一致するプロファイル画像とともに取得しようとしています。

これまでの私のクエリ:

SELECT u.id, u.username, u.status, p.file_name
FROM users AS u, profile_pictures AS p
WHERE p.status = 1 AND u.status != 3 AND u.status != 4
AND RAND()<(SELECT ((1/COUNT(*))*10) FROM users AS u)
GROUP BY u.id
ORDER BY RAND()
LIMIT 7

問題は、すべての行で同じプロファイル画像を取得していることです。

あなたが私を助けてくれることを本当に願っています。

4

2 に答える 2

1

ユーザーから 10 個のランダムな行を取得する場合はusers、結合の前にサブクエリで選択を行う必要があります。

SELECT u.id, u.username, u.status, p.file_name
FROM (select u.*
      from users u
      where u.status <> 3 AND u.status <> 4
      order by rand()
      limit 10
     ) u7 join
     profile_pictures p
     on u.id = p.user_id and p.status = 1;

これにより、結合表記も修正されます。ユーザーから 10 枚のランダムな写真が必要な場合は、参加後に選択を行うことができます。

SELECT u.id, u.username, u.status, p.file_name
FROM users u join
     profile_pictures p
     on u.id = p.user_id
where u.status <> 3 AND u.status <> 4 and p.status = 1
order by rand()
limit 10;

ちなみに、これも結合を修正します。おそらく、写真をユーザーに接続するユーザーIDフィールドがあります。

于 2013-09-09T01:02:20.250 に答える
0

LEFT JOIN ステートメントを使用して、ユーザーとその写真を一致させます。profile_pictures には、それらを照合するために使用する user_id という列があると想定しています。LEFT JOIN は、写真の有無に関係なくユーザーを返します。写真を持っているユーザーのみを返したい場合は、代わりに INNER JOIN を使用してください。

SELECT u.id, u.username, u.status, p.file_name
FROM users AS u
LEFT JOIN profile_pictures AS p ON u.id = p.user_id
WHERE p.status = 1 AND u.status != 3 AND u.status != 4
ORDER BY RAND()
LIMIT 7

RAND()<(SELECT ((1/COUNT(*))*10) FROM users AS u)は不要そうなので外しました。それは何のためにそこにあったのですか?

于 2013-09-09T00:11:08.293 に答える