如何确保每个playerid拥有至少1个主图像,如果他有超过0个图像(mysql)

时间:2011-05-03 14:06:27

标签: mysql sql

我正在使用图片表。我需要确保每个玩家有一张主图像,如果他有超过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

4 个答案:

答案 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

这样,玩家只能拥有一张适用的主图像。