2011-12-21 3 views
3

У меня есть набор путей изображений, сохраненные в таблице, как это:Получение имени пустого столбца с MySQL

+---------------------------------------------------------+ 
    |ID   |pimg0  |pimg1   |pimg2   | 
    +-------------+-------------+--------------+--------------+ 
    |1   |path/to/img0 |path/to/img1 |    | 
    +---------------------------+--------------+--------------+ 
    |2   |path/to/img0 |path/to/img1 |    | 
    +---------------------------+--------------+--------------+ 

, и я хочу, чтобы получить имя таблицы в пустом поле, так что я могу поставить новый вход в него.

Я попытался вложенности IFNULL() команды в запросе MySQL, который не работал:

IFNULL(pimg0, IFNULL(pimg1, IFNULL(pimg2, IFNULL(pimg3, IFNULL(pimg4, IFNULL(pimg5)))))) 

Я также попробовал некоторые тематические блоки, которые не работают. В идеале я бы хотел, чтобы мой запрос возвращал «pimg2» в описанном выше сценарии, но если бы он возвращал «pimg1», я мог бы легко увеличить его.

EDIT: отредактировал приведенную выше таблицу, чтобы уточнить.

+0

Просто семантическая вещь, было бы проще хранить только имя файла вместо пути/to/file/name.jpg? Таким образом, вы можете обновить свой код, если вам нужно изменить структуру файла, без необходимости редактировать данные каждой строки в базе данных. –

+0

Да, у меня фактически есть имя изображения в db, путь файла скомпилирован с php, когда цикл запущен. –

+0

И .. вы хотите получить имя столбца с пустым/нулевым значением, верно? Тогда что, выполнить обновление, чтобы заполнить его? Будет ли значение основываться на имени столбца? – Nonym

ответ

1

Вы испытываете одну из болевых точек repeating groups across columns, что является нарушением первой нормальной формы.

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

CREATE TABLE Images (
    image_id INT AUTO_INCREMENT PRIMARY KEY, 
    owner_id INT NOT NULL, -- references `id` in your original table 
    pimg  VARCHAR(40) 
); 
INSERT INTO Images (owner_id, pimg) VALUES 
(1, 'path/to/img0'), (1, 'path/to/img1'), 
(2, 'path/to/img2'), (2, 'path/to/img3'); 

Структурирование базы данных таким образом делает его легче сделать много задач:

  • Вставьте новый образ с помощью вставки новой строки; нет необходимости находить пустой столбец.
  • Добавить четвертое или пятое изображение к заданному owner_id.
  • Поиск данного изображения и отчета, которому принадлежит owner_id.
  • Количество изображений на owner_id.
  • Избегайте дубликатов.
+0

+1 приятный лаконичный ответ – ManseUK

+0

Это фантастика и помешала бы мне когда-либо иметь эту проблему. Я решил проблему ниже, но это лучшее решение. –

1
SELECT id, 'pimg0' 
FROM table WHERE pimg0 is null 
UNION 
SELECT id, 'pimg1' 
FROM table WHERE pimg1 is null 
UNION 
SELECT id, 'pimg2' 
FROM table WHERE pimg2 is null 
+0

В вашей второй фразе WHERE есть опечатка. Я думаю, что это должно быть pimg1 – liquorvicar

0

Хотя вы, вероятно, можете сделать это в sql, я лично сделал бы это в php; просто получите целую строку и пройдите по полям, пока не найдете пустой результат.

Таким образом, он будет продолжать работать автоматически, если вы решите добавить дополнительные столбцы в будущем.

+0

Я думаю, что вы можете быть правы, php намного проще работать, чем mysql в любом случае –

0
IFNULL(concat('t0|',pimg0), IFNULL(concat('t1|',pimg1), IFNULL(concat('t2|',pimg2), IFNULL(concat('t3|',pimg3), IFNULL(concat('t4|',pimg4), IFNULL(concat('t5|',pimg5))))))) 

Затем используйте "|" в качестве разделителя, чтобы получить значение и столбец

ДОБАВЛЕНИЕ

MySql может дать вам непосредственно значению и столбца

select 
IFNULL(pimg0, IFNULL(pimg1, IFNULL(pimg2, IFNULL(pimg3, IFNULL(pimg4, IFNULL(pimg5)))))) as value,  
SUBSTRING_INDEX(IFNULL(concat('t0|',pimg0), IFNULL(concat('t1|',pimg1), IFNULL(concat('t2|',pimg2), IFNULL(concat('t3|',pimg3), IFNULL(concat('t4|',pimg4), IFNULL(concat('t5|',pimg5))))))), '|',1) as columnname 
+0

жаль, что я не понимаю rquest. –

0

я делаю как ответ MySQL, предоставленной Zohaib выше, но если вы хотите идти по маршруту джеронов и делать это на PHP, вам нужно что-то вроде:

$query = "SELECT * FROM table"; 
$result = mysql_query or die(); 
while($row = mysql_fetch_array($result)) 
{ 
     foreach($row as $key => $val) 
     { 
      if(empty($val)) 
      { 
       //DoStuff 
       print "Empty $key in ID: {$row['id']}<br/>"; 
      } 
     } 
    } 
0

Я думаю, что я иметь это.

$sql=" 
    SELECT 
    * 
    FROM 
    table 
    WHERE 
    ID = $id 
    "; 

$query=mysql_query($sql)or die(mysql_error()); 
$array=mysql_fetch_assoc($query); 

for($i=0; $i<=6; $i++){ 
    $imageentry = "pimg".$i; 
    if($array[$imageentry]=='' or $array[$imageentry]=null){ 
    $nextimagenumber = $i; 
    break; 
} 
} 
echo $nextimagenumber; 

Это возвращает следующий номер поля пустого «pimg», даже если существует пробел в таблице, поэтому запуск его на стол, как это:

+---------------+---------------+---------------+ 
|pimg0   |pimg1   |pimg2   | 
+---------------+---------------+---------------+ 
|img0   |    |img2   | 
+---------------+---------------+---------------+ 

возвращает «2»

Смежные вопросы