Как сделать так, чтобы у каждого игрока было хотя бы 1 основное изображение, если у него более 0 изображений (mysql) - PullRequest
1 голос
/ 03 мая 2011

Я работаю с таблицей изображений.Мне нужно убедиться, что у каждого игрока есть основное изображение, если у него более одного изображения.В следующем примере набора данных это приведет к обновлению либо myimage.jpg, либо первичного файла hisimage.jpg до 1, а основного только only1image.jpg до 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 ]

2 голосов
/ 03 мая 2011

Я предполагаю, что должен быть стол игрока?Если это так, вы можете использовать следующее ...

(Это в синтаксисе 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)

Это сознательно выбирает изображение с самым низким идентификатором, чтобы установить в качестве основного.Измените коррелированный подзапрос для реализации другой логики.

EDIT

Версия, которая не использует таблицу 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)
0 голосов
/ 03 мая 2011

Рассмотрим рефакторинг ваших таблиц.

В вашей таблице игроков есть столбец, который указывает на строку изображения, являющуюся основным изображением, например:

player
---------
player_id
primary_image_id


image
---------
image_id
player_id

Таким образом,у игрока будет только одно применимое основное изображение.

0 голосов
/ 03 мая 2011

В качестве альтернативы вы можете установить primary на 1 по умолчанию, создать уникальность с помощью (Player,primary) и добавить ON DUPLICATE KEY UPDATE primary=0

0 голосов
/ 03 мая 2011

Вот ответвление @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
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...