Я предполагаю, что каждый 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
;
Очевидно, что при отбрасывании столбцов следует проявлять особую осторожность и делать резервные копии перед началом!