我正在使用图片表。我需要确保每个玩家有一张主图像,如果他有超过1张图像。在下面的示例数据集中,这会将myimage.jpg或hisimage.jpg的primary更新为1,将only1image.jpg的primary更新为1.
Table: Images
Playerid - 16
Image - myimage.jpg
primary - 0
Playerid - 16
Image - hisimage.jpg
primary - 0
Playerid - 17
Image - only1image.jpg
primary - 0
Playerid - 18
Image - jamison.jpg
primary - 1
答案 0 :(得分:2)
我假设必须有一张播放器表?如果是这样,您可以使用以下内容......
(这是MS SQL Server语法,但逻辑应该存在于MySQL中。)
UPDATE
Images
SET
Primary = 1
FROM
Player
INNER JOIN
Image
ON Image.ID = (SELECT MIN(lookup.ID) FROM Image AS lookup WHERE lookup.playerID = Player.ID)
WHERE
NOT EXISTS (SELECT 1 FROM Image AS lookup WHERE lookup.playerID = Player.ID AND lookup.Primary = 1)
这故意选择具有最低ID的图像设置为主要图像。改变相关的子查询以实现不同的逻辑。
修改强>
不使用Player表的版本,但可能更慢(需要测试)......
UPDATE
Image
SET
Primary = 1
WHERE
ImageID = (SELECT MIN(lookup.ID) FROM Image AS Lookup WHERE lookup.PlayerID = Image.PlayerID)
AND NOT EXISTS (SELECT 1 FROM Image AS Lookup WHERE lookup.PlayerID = Image.PlayerID AND lookup.Primary = 1)
答案 1 :(得分:0)
这是@Dems的分拆,这对我来说更有意义
UPDATE Images SET `primary` = 1 WHERE Player IN (
SELECT Player FROM (
SELECT Player, MAX(`primary`) as max_prim FROM Images GROUP BY Player
) as MPrim WHERE max_prim = 0
)
答案 2 :(得分:0)
或者,您可以将primary
默认设置为1,并按(Player,primary)
创建唯一性并添加ON DUPLICATE KEY UPDATE primary=0
答案 3 :(得分:0)
考虑重构你的表格。
在播放器表格中有一列指向作为主图像的图像行,如下所示:
player
---------
player_id
primary_image_id
image
---------
image_id
player_id
这样,玩家只能拥有一张适用的主图像。