Проверка за стринг със запетайки дали съществува част от него в sql колона

Pok4

Registered
Здравейте,
Имам проблем и не знам как да го реша.. Пробвах с FIND_IN_SET, с LIKE %%, LOCATE и какво ли още не. Четох в нета, търсих, но нищо.
Значи имам 1 колона в таблицата, която съдържа различни неща свързани с детайлите на имотите. Ето пример:
Internet
Security
Furnished
TV
и т.н.
Имам и 1 голям стринг от рода на "Internet, Security, TV" (виждате, че няма Furnished в него)
Този стринг винаги е със запетайките и винаги може да липсва нещо в него или да има нещо допълнително (тоест варира)

Искам този стринг (част от него), ако се засече с mysql колоната да върне резултата със съвпадението.

Ето я функцията:

PHP:
function check_osobenosti($value,$id_field) {
    global $dbh;
    //proceed
    $trim_v = trim($value);
    $query2 = $dbh->query("SELECT `field_name` FROM wpls_sw_field_lang  WHERE FIND_IN_SET('".$trim_v."',`field_name`) > 0  AND `field_id`='".(int)$id_field."'");
    if($query2->rowCount() > 0) {
        return 1;
    } else {
        return '';
    }
}

Нищо не работи, не знам въобще какво да правя.. Зацепил съм и не знам и дали е възможно.. И с REGEXP четох и пробвах, но не ми сработи..
Дайте някакви идеи..

Тази функция се ползва в 1 sql заявка и сетва 1 или нищо, ако е открито съвпадение. Ако няма съвпадение нищо не сетва.
За парсера ми трябва, цял ден се мъча с това .. :D Нещо извратено ще е със сигурност и за това питам тук.
Ето и пример:
PHP:
             //proceed to insert in wpls_sw_listing_field
             $query2 = $dbh->prepare("INSERT INTO `wpls_sw_listing_field` (`lang_id`, `listing_id`, `field_id`, `value`, `value_num`) VALUES
                (1, ".$listing_id.", 110, '', NULL),
                (1, ".$listing_id.", 114, '".$phone_maca."', NULL),
                (1, ".$listing_id.", 116, '".$author."', NULL),
                (1, ".$listing_id.", 10, '".$title."', NULL),
                (1, ".$listing_id.", 13, ?, NULL),
                (1, ".$listing_id.", 78, '', NULL),
                (1, ".$listing_id.", 8, '', NULL),
                (1, ".$listing_id.", 1, '', NULL),
                (1, ".$listing_id.", 36, '".$price."',NULL),
                (1, ".$listing_id.", 57, '', NULL),
                (1, ".$listing_id.", 4, 'For Sale', NULL),
                (1, ".$listing_id.", 5, '".$kvadratura."', NULL),
                (1, ".$listing_id.", 20, '', NULL),
                (1, ".$listing_id.", 19, '', NULL),
                (1, ".$listing_id.", 113, '".$etaj."', NULL),
                (1, ".$listing_id.", 21, '".check_osobenosti($osobenosti,21)."', NULL),
                (1, ".$listing_id.", 22, '".check_osobenosti($osobenosti,22)."',NULL),
                (1, ".$listing_id.", 23, '".check_osobenosti($osobenosti,23)."',NULL),
                (1, ".$listing_id.", 29, '".check_osobenosti($osobenosti,29)."', NULL),
                (1, ".$listing_id.", 31, '".check_osobenosti($osobenosti,31)."', NULL),
                (1, ".$listing_id.", 112, '".check_osobenosti($osobenosti,112)."', NULL),
                (1, ".$listing_id.", 52, '".check_osobenosti($osobenosti,52)."', NULL),
                (1, ".$listing_id.", 32, '".check_osobenosti($osobenosti,32)."', NULL),
                (1, ".$listing_id.", 30, '".check_osobenosti($osobenosti,30)."', NULL),
                (1, ".$listing_id.", 11, '".check_osobenosti($osobenosti,11)."', NULL),
                (1, ".$listing_id.", 27, '".check_osobenosti($osobenosti,27)."', NULL),
                (1, ".$listing_id.", 33, '".check_osobenosti($osobenosti,33)."', NULL),
                (1, ".$listing_id.", 115, '".check_osobenosti($osobenosti,115)."', NULL),
                (1, ".$listing_id.", 18, '', NULL),
                (1, ".$listing_id.", 35, '', NULL),
                (1, ".$listing_id.", 0, '', NULL);");
                $query2->bindParam(1, $description, PDO::PARAM_STR);
                $query2->execute();
 
Ето и снимка на таблицата:
 

Прикачени файлове

  • дд.png
    дд.png
    255.2 KB · Преглеждания: 2
Сега вече можеш да се замислиш защо се прави нормализация на базата данни.

FIND_IN_SET() вероятно не ти намира нищо понеже търси за точни стойности (от запетая до запетая включително разстоянието). Не трябва да имаш място след запетаята, иначе трябва да търсиш "разстоянието + думата".

Вярно: "a,b,c,d"
Невярно: "a, b, c, d"
 
Не тръгна, пробвах така:
PHP:
SELECT `field_name` FROM wpls_sw_field_lang  WHERE FIND_IN_SET('FurnishedElevator',`field_name`) > 0  AND `field_id`='30';

SELECT `field_name` FROM wpls_sw_field_lang  WHERE FIND_IN_SET('FurnishedElevator',`field_name`) > 0  AND `field_id`='112';

SELECT `field_name` FROM wpls_sw_field_lang  WHERE FIND_IN_SET('Furnished,Elevator',`field_name`) > 0  AND `field_id`='30';

SELECT `field_name` FROM wpls_sw_field_lang  WHERE FIND_IN_SET('Furnished,Elevator',`field_name`) > 0  AND `field_id`='112';
 
Сега вече можеш да се замислиш защо се прави нормализация на базата данни.

FIND_IN_SET() вероятно не ти намира нищо понеже търси за точни стойности (от запетая до запетая включително разстоянието). Не трябва да имаш място след запетаята, иначе трябва да търсиш "разстоянието + думата".

Вярно: "a,b,c,d"
Невярно: "a, b, c, d"
Баш на място.
Всеки запис от запетая до запетая следва да е отделен запис.
 
Не тръгна, пробвах така:
PHP:
SELECT `field_name` FROM wpls_sw_field_lang  WHERE FIND_IN_SET('FurnishedElevator',`field_name`) > 0  AND `field_id`='30';

SELECT `field_name` FROM wpls_sw_field_lang  WHERE FIND_IN_SET('FurnishedElevator',`field_name`) > 0  AND `field_id`='112';

SELECT `field_name` FROM wpls_sw_field_lang  WHERE FIND_IN_SET('Furnished,Elevator',`field_name`) > 0  AND `field_id`='30';

SELECT `field_name` FROM wpls_sw_field_lang  WHERE FIND_IN_SET('Furnished,Elevator',`field_name`) > 0  AND `field_id`='112';
Ти не знаеш какво правиш, за това. Не можеш да намериш няколко думи разделени със запетая в сета. Ако искаш да намериш няколко думи ти трябва да имаш няколко FIND_IN_SET извиквания за всяка дума по отделно.

Това, което ти е във field_name трябва да ти е коректно направен сет. Т.е.

SQL:
SELECT field_name FROM tbl t WHERE FIND_IN_SET("Furnished", field_name) OR FIND_IN_SET("Elevator", field_name) AND field_id = 1;

като field_name трябва да е структуриран по следния начин: "Furnished,Elevator" и т.н. Без разстояние между запетаите.
 
Аз се оправих, снощи като легнах си викам ай стига цял ден се занимавам с глупости и го направих така:
PHP:
function check_osobenosti($value,$id_field) {
    global $dbh;
    //proceed
    $trim_v = trim($value);
    $query2 = $dbh->query("SELECT `field_name` FROM wpls_sw_field_lang  WHERE `field_id`='".(int)$id_field."'");
    if($query2->rowCount() > 0) {
        $row = $query2->fetch(PDO::FETCH_ASSOC);
        if(str_contains($row['field_name'], $trim_v)) {
            return 1;
        } else {
            return '';
        }
    } else {
        return '';
    }
}
 
Последно редактирано:

Back
Горе