我有用户在我的数据库中上传的照片记录。他们可以指定他们上传的其中一张照片作为封面照片。
我想查询我的数据库,为每个用户名返回一张照片。如果他们有封面照片,请退回该照片。如果没有,请拉一张普通照片。用于指定封面照片的列是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))
答案 0 :(得分: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');
答案 1 :(得分: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')
答案 2 :(得分: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
答案 3 :(得分: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中的一个用户名。