1

我的数据库中有用户上传的照片记录。他们可以将上传的其中一张照片指定为封面照片。

我想查询我的数据库为每个用户名返回一张照片。如果他们有封面照片,请退回那张。如果没有,请拉一张普通照片。指定封面照片的列是tinyint,长度为1。该列是“0”(不是封面照片)或“1”(封面照片)。

我有以下内容可以返回用户名列表的所有照片

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

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

但我需要将它与以下内容结合起来,如果有一个用户名,它会得到一张封面照片,如果没有一个用户名,它会得到一张普通照片。

$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

假设您有一个 user 表并且 photo 表有一个 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

如果您只想要每个用户 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 回答
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')

这本质上是在没有封面或封面的情况下找到一张照片(最少一张)。相关子查询对此有一些变化,这可能会更快。

顺便说一句,('$usernames') 中的 p.username 在 mysql 中有效吗?在其他数据库中,这仅适用于 $usernames 中的一个用户名。

于 2012-07-18T23:53:35.280 回答