Mysql кол-во столбцов - PullRequest
       14

Mysql кол-во столбцов

1 голос
/ 04 мая 2010

У меня есть таблица для галереи изображений с четырьмя столбцами, как:

foid | uid | pic1  | pic2  | pic3  | date     |
-----------------------------------------------
104  |  5  | 1.jpg | 2.jpg | 3.jpg | 2010-01-01
105  | 14  | 8.jpg |       |       | 2009-04-08
106  | 48  | x.jpg | y.jpg |       | 2010-08-09

Mysql-запрос для галерей пользователя выглядит так:

SELECT * FROM foto WHERE uid = $id order by foid DESC

Я хочу подсчитать количество изображений (PIC1, PIC2, ​​PIC3) в каждой из перечисленных галерей.

Как лучше всего это сделать?

1 Ответ

5 голосов
/ 04 мая 2010

Я предполагаю, что каждый foid представляет галерею:

SELECT foid, uid, date,
       (CASE WHEN pic1 IS NULL THEN 0 ELSE 1 END +
        CASE WHEN pic2 IS NULL THEN 0 ELSE 1 END +
        CASE WHEN pic3 IS NULL THEN 0 ELSE 1 END
       ) AS pic_count
  FROM foto
 WHERE uid = $id
 ORDER BY foid DESC

Кстати, это не очень разумный способ структурировать вашу схему. Вы действительно должны разделить фотографии в отдельной таблице:

foto:
foid | uid | date
-----------------------
104  |  5  | 2010-01-01
105  | 14  | 2009-04-08
106  | 48  | 2010-08-09

pic:
foid | pic
------------
104  | 1.jpg
104  | 2.jpg
104  | 3.jpg
105  | 8.jpg
106  | x.jpg
106  | y.jpg

Теперь в галереях может быть более трех фотографий, и запрос к ним стал проще:

SELECT foid, uid, date, COUNT(*)
  FROM foto
  JOIN pic USING (foid)
 WHERE uid = $id
 ORDER BY foid DESC
 GROUP BY foid, uid, date

РЕДАКТИРОВАТЬ: Вы можете разделить существующую базу данных таким образом (просто угадывая такие вещи, как типы столбцов):

CREATE TABLE picture (foid INT, pic VARCHAR(255));

INSERT INTO picture (foid, pic)
        SELECT foid, pic1 as pic FROM foto WHERE pic IS NOT NULL
        UNION
        SELECT foid, pic2 as pic FROM foto WHERE pic IS NOT NULL
        UNION
        SELECT foid, pic3 as pic FROM foto WHERE pic IS NOT NULL
    ;

ALTER TABLE foto
    DROP COLUMN pic1,
    DROP COLUMN pic2,
    DROP COLUMN pic3
    ;

Очевидно, что при отбрасывании столбцов следует проявлять особую осторожность и делать резервные копии перед началом!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...