1

ユーザーがデータベースにアップロードした写真の記録があります。アップロードした写真の 1 つをカバー写真として指定できます。

データベースにクエリを実行して、ユーザー名ごとに 1 枚の写真を返したいと思います。カバー写真がある場合は、それを返します。そうでない場合は、通常の写真を引きます。カバー写真を指定する列は、長さが 1 の tinyint です。列は、"0" (カバー写真ではない) または "1" (カバー写真) のいずれかです。

ユーザー名のリストのすべての写真を返すには、次のようにします

$usernames = array('bob', 'ted', 'jim');
$usernames = implode( "', '", $usernames );

$query = "SELECT * FROM Photos WHERE username IN('$usernames')";

しかし、私はそれを次のものと組み合わせる必要があります.1つのユーザー名がない場合はカバー写真があり、通常の写真がありません.

$query = "SELECT * FROM Photos WHERE username = 'bob' ORDER BY cover DESC LIMIT 1";

GROUP BY 関数を使用する必要があると思いますが、その設定方法がわかりません。助言がありますか?

列は、id(bigint)、name(varchar(255))、cover(tinyint)、username(varchar(30)) です。

4

4 に答える 4

3

ユーザーテーブルがあり、写真テーブルにid列があると仮定します

SELECT p.*
FROM Users u 
INNER JOIN Photo p ON p.id = (
    SELECT id FROM Photos p2 
    WHERE p2.username = u.username 
    ORDER BY cover DESC 
    LIMIT 1
)
WHERE u.username IN('$usernames');
于 2012-07-19T00:06:32.097 に答える
0

各レコードに一意の識別子(id)がある場合は、次の操作を実行できます。

SELECT P1.* FROM Photos P1
WHERE P1.id IN (SELECT P2.id FROM Photos P2 
                WHERE P2.username =P1.username 
                ORDER BY P2.cover DESC LIMIT 1)
AND P1.username IN ('$usernames')
ORDER BY P1.username
于 2012-07-18T23:52:09.727 に答える
0

Mysqlでは、次のようなことを行う必要があります。

select p.*
from Photos p left outer join
     (select username, min(photoid) as minphotoid
      from photos p
      where cover = 0
      group by username
     ) pmin
     on p.username = pmin.username and
        (p.cover = 1 or p.photoid = pmin.minphotoid)
where p.username in ('$usernames')

これは基本的に、カバーがない場合またはカバーがない場合に1枚の写真(最小の写真)を見つけることです。これには、相関サブクエリによるバリエーションがあり、より高速になる可能性があります。

ちなみに、('$ usernames')のp.usernameはmysqlで機能しますか?他のデータベースでは、これは$usernames内の1つのユーザー名でのみ機能します。

于 2012-07-18T23:53:35.280 に答える
0

ユーザーごとに 1 つの写真のみが必要な場合 (カバーがある場合はカバー、カバーがない場合は通常)

SELECT max( cover ) , username, photo
FROM Photos
WHERE username IN('$usernames')
GROUP BY username 

すべての通常の写真と 1 つのカバー写真 (存在する場合) のみが必要な場合は、次のことができます。

SELECT * FROM Photos WHERE cover = 1 AND username IN ('$usernames') GROUP BY username
UNION
SELECT * FROM Photos WHERE cover = 0 AND username IN ('$usernames')
于 2012-07-18T23:34:00.873 に答える