2013-05-07 3 views
0

Кажется, что я задаю простой вопрос, но я не смог найти ответ, который работает на меня. Я надеюсь, что вы можете помочь!mysql: IF 'some columns value' DISTINCT THEN flip boolean value

Я пишу php-скрипт, который принимает некоторые данные формы из html-файла (name, artist, song) и помещает его в таблицу со столбцами (name, artist, song, queue, newcomer). Теперь столбец newcomer является булевым; и я хочу, чтобы это логическое значение изменилось с значения по умолчанию false или 0, на true или 1, если значение имени входящих данных формы уникально.

Это моя попытка:

$newcomer = mysql_query(
       'IF NOT EXISTS (SELECT DISTINCT name FROM tbl_queue) 
       THEN UPDATE tbl_queue newcomer=1' 
      ); 

но, очевидно, она не работает ...

Спасибо заранее !!


привет и спасибо за ответ! Тем не менее он по-прежнему не работает для меня = ( это код из PHP:

$ новичку = mysql_query ("UPDATE SET tbl_queue пришелец = 1 WHERE имя = '" $ _POST [имя] ".". И НЕ СУЩЕСТВУЕТ (SELECT DISTINCT имя FROM tbl_queue WHERE имя = '»$ _POST [имя]. " ")");?

+1

Просто FYI: использование $ _POST непосредственно в вашем запросе sql сделает ваш PHP-скрипт уязвимым для [SQL-инъекций] (http://en.wikipedia.org/wiki/Sql_injection). – klennepette

ответ

0

я был бы соблазн сделать свою первоначальную вставку, как это: -

INSERT INTO tbl_queue (name, artist, song, queue, newcomer) 
SELECT DISTINCT a.name, a.artist, a.song, a.queue, CASE WHEN b.newcomer IS NULL THEN 0 ELSE 1 END as newcomer 
FROM (SELECT '$name' AS name, '$artist' AS artist, '$song' AS song, '$queue' AS queue) a 
LEFT OUTER JOIN tbl_queue b 
ON a.name = b.name 

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

EDIT - Ниже приведено несколько php, показывающих присвоения var и escape-значения. Я использовал функции mysql_ здесь, как и в вашем исходном сообщении, но на самом деле должен использовать функции mysqli_ для будущих доказательств.

<?php 

$name = mysql_real_escape_string($_POST['name']); 
$artist = mysql_real_escape_string($_POST['artist']); 
$song = mysql_real_escape_string($_POST['song']); 
$fcfs_queue = mysql_real_escape_string($_POST['fcfs_queue']); 

$sql = ("INSERT INTO tbl_queue (name, artist, song, fcfs_queue, newcomer) 
SELECT DISTINCT a.name, a.artist, a.song, a.fcfs_queue, CASE WHEN b.newcomer IS NULL THEN 0 ELSE 1 END as newcomer 
FROM (SELECT '$name' AS name, '$artist' AS artist, '$song' AS song, '$fcfs_queue' AS fcfs_queue) a 
LEFT OUTER JOIN tbl_queue b 
ON a.name = b.name"); 


if (!mysql_query($sql)) 
{ 
    die('Error: ' . mysql_error()); 
} 
echo "success"; 


?> 
+0

Хорошо, я мог бы попробовать это, но я новичок :) И я не понимаю, что. и b. является? – Kei

+0

a и b являются псевдонимами. а. является псевдонимом для подзапроса, а b. является псевдонимом для таблицы tbl_queue. – Kickstart

+0

попытался прокомментировать это, но мой ответ не соответствовал ограничениям, поэтому вместо моего ответа на мой вопрос был задан код. – Kei

1
"UPDATE tbl_queue SET newcomer=1 
    WHERE name = '" . $name_variable . "' AND 
      NOT EXISTS (SELECT DISTINCT name 
          FROM tbl_queue 
          WHERE name='" . $name_variable . "')" 

Это то, что вы пытаетесь сделать Очевидно заменить $ name_variable с правильным переменная

Edit:. переформатирован SQL

+0

Я ответил на это как ответ на поток, но он был удален; теперь он находится в исходном посте как редактирование. Я попробовал ваше решение, но, к сожалению, это не сработало. К сожалению, потому что это единственный ответ, который я действительно понимаю =)) – Kei

+0

Почему он не работал? – Ryan

+0

Возвращает: «Предупреждение: mysql_error() ожидает, что параметр 1 будет ресурсом, логическим значением в /customers/b/6/d/coriantes.com/httpd.www/insert_records.php в строке 34 Ошибка:« Код: $ sql = mysql_query ("UPDATE tbl_queue SET newcomer = 1 WHERE name = '". $ _POST [имя]. "" И НЕ СУЩЕСТВУЕТ (SELECT DISTINCT name FROM tbl_queue WHERE name =' ". $ _POST [имя]." ') " ); – Kei

0

Я хотел, чтобы быть комментарием к Kickstart но он не вписывается в пределах комментария, так .. я надеюсь, что это нормально, я отвечаю здесь?

Спасибо! Однако это не сработало ... Он возвращает эту ошибку: Предупреждение: mysql_error() ожидает, что параметр 1 будет ресурсом (относительно этой строки: die ('Error:'.mysql_error ($ SQL)); в если заявление)

Мой код:

$sql = ("INSERT INTO tbl_queue (name, artist, song, fcfs_queue, newcomer) 
SELECT DISTINCT a.name, a.artist, a.song, a.fcfs_queue, CASE WHEN b.newcomer IS NULL THEN 0 ELSE 1 END as newcomer 
FROM SELECT '$name' AS name, '$artist' AS artist, '$song' AS song, '$fcfs_queue' AS fcfs_queue) a 
LEFT OUTER JOIN tbl_queue b 
ON a.name = b.name"); 


if (!mysql_query($sql)) 
    { 
    die('Error: ' . mysql_error($sql)); 
    } 
echo "success"; 
+0

У вас в SQL отсутствует скобка. Добавьте открытую скобку между FROM и SELECT (т.е. FROM (SELECT '$ name' AS name) – Kickstart

+0

Ох, как смущающе: o Изменено. Однако все еще нет удачи = ( Код ошибки: Код: $ sql = («INSERT INTO tbl_queue (имя, исполнитель, песня, fcfs_queue, новичок) SELECT DISTINCT a.name, a.artist, a.song, a.fcfs_queue, CASE WHEN b.newcomer IS NULL THEN 0 ELSE 1 END как новичок FROM SELECT ('$ name' AS name, '$ artist' AS artist, '$ song' AS song, '$ fcfs_queue' AS fcfs_queue) a LEFT OUTER JOIN tbl_queue b ON a.name = b.name "); – Kei

+0

Может ли проблема заключаться в том, что я использую MySQL версии 3.x ..? – Kei

0

Я хотел бы использовать триггер для этого, так как это «фиксированный» требование для таблицы:

DROP TRIGGER IF EXISTS `newComerCheck`// 
CREATE TRIGGER `newComerCheck` BEFORE INSERT ON `songs` 
FOR EACH ROW BEGIN 
    DECLARE c integer; 
    SELECT COUNT(name) FROM `songs` WHERE `name`=NEW.name INTO c; 

    IF (c >= 1) THEN 
     SET NEW.newcomer=0; 
    ELSE 
     SET NEW.newcomer=1; 
    END IF; 
    END 
// 

См скрипку: http://sqlfiddle.com/#!2/3e73b5/1

+0

Большое спасибо! Я попробую это, если решение Кикстарта не сработает (теперь, когда я это пытаюсь). – Kei

+0

@ Kei не забудьте установить разделитель на // при добавлении триггера. ('DELIMITER //') Otherwhise вы получите синтаксические ошибки. – dognose

+0

Хорошо. Thanx! Я не уверен, что такое разделитель, но это то, что вызывает триггер? NewComerCheck в строках 1 и 2? – Kei

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