2015-06-04 4 views
0

У меня проблема с match() против() в MySQL. Я не могу совместить 2 columfields друг против друга, только если я использую процедуру, это ясно.MySQL сопоставляется с двумя полями

Теперь проблема: У меня есть запрос для поиска двойных записей (только technnical данные):

SELECT t1.acid,t2.acid, t1.Brand, t2.ModelNameRough,t1.ModelNameDetail, t2.ModelNameDetail,......... 
FROM ref_web_tb t1 join ref_web_tb t2 
on t1.Brand = t2.Brand 
and t1.ModelNameRough = t2.ModelNameRough 
and t1.BodyType ....(alot of other things to compare) 
and (t1.acid < t2.acid) 

, но это еще не достаточно. Существует поле, называемое «modelnamedetail», который блокирует как: «1,9 TDI COMFORT ВАРИАНТ DPF» или «1,9 TDI COMFORTLINE ВАРИАНТ DPF»

(только линия в комфорте отличается, но оба автомобилей имеют разные цены и т. д., но те же технические данные)

Так что я должен сопоставить имя t1.modelname с именем t2.modelname и использовать оценку, чтобы проверить, почти ли это имя. (otherwhise было бы loooooot данных, чтобы проверить, есть ли двойная запись, потому что есть много автомобилей с теми же техническими данными в той же самой грубой модели)

Процедура для матча() против() нет проблема, я хотел бы сделать это следующим образом: (только тест)

DELIMITER $$ 

DROP PROCEDURE IF EXISTS `offensichtlich_doppelte` $$ 
CREATE PROCEDURE `offensichtlich_doppelte` (search_string TEXT) 
DETERMINISTIC 
READS SQL DATA 
BEGIN 

SELECT t1.acid, t1.Brand,t1.ModelNameRough,t1.ModelNameDetail, MATCH (t1.ModelNameDetail) AGAINST (search_string) AS score 
    FROM ref_web_tb t1 

     limit 50; 

END $$ 

DELIMITER ; 

но сейчас я понятия не имею, как использовать результаты запроса с процедурой ?! Im суммарно спутать, что теперь делать; ( Может кто-нибудь дать мне подсказку, как я могу решить эту проблему

И еще один короткий вопрос: Иногда такие вещи, как «gearboxtype» является нулевой Если один из технических областей?. имеет нулевое значение, то wontget перечисленные Могу ли я сделать что-то вроде:.?

SELECT * 
FROM ref_web_tb t1 join ref_web_tb t2 
on .... 
and if gearboxtype is null then ignore gearboxtype 
.... 

Я думал, что-то вроде:

SELECT * 
    FROM ref_web_tb t1 join ref_web_tb t2 
    on .... 
    and if(t1.gearboxtype is null, ignore, t1.gearboxtype = t2.gearboxtype) 
    .... 

будет работать, но кажется, что нет, потому что я не знаю, как игнорировать случай; ( (подождите .. это может быть ответ?)

Спасибо за чтение;)

+0

Можете ли вы объяснить второй вопрос? Разве вы не можете просто поставить предложение «WHERE geartype IS NOT NULL»? – Cynical

+0

Эй, öähm, как я уже сказал, я присоединяюсь к таблице на себе. Иногда некоторые поля в условии соединения равны нулю. Если я присоединяюсь к t1.gearboxtype в t2.gearboxtype, и оба они равны null, он dosnt считается равным и объединение терпит неудачу, даже все остальные поля равны. Так что я должен игнорировать поле в conditon, если его значение null, но все же сравнивает непустые поля. (некоторые поля arnt заполнены, потому что у нас не было данных и т. Д.) Надеюсь, вы понимаете, что я имею в виду. – user3793935

+0

Что бы я ни делал сейчас: и if ((t1.GearBoxType равно null) и (t2.GearBoxType равно null), t1.Brand = t2.Brand, t1.GearBoxType = t2.GearBoxType) (бренд cant be null) Возможно, это не самый красивый вариант, но он работает. – user3793935

ответ

1

Что касается первого вопроса, то я думаю, что cursors является то, что вы ищете.

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

DECLARE a CHAR(10); 
DECLARE b INT; 

Поскольку курсор может перемещаться только один раз, вы должны обрабатывать NOT FOUND исключение в конце.

DECLARE done INT DEFAULT FALSE; 
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE; 

Затем вы объявляете cursor для извлечения данных.

DECLARE results CURSOR 
FOR 
SELECT stuff, otherstuff FROM someTable; 

Это просто создает курсор.Вы затем открыть его для того, чтобы фактически выполнить запрос:

OPEN results; 

Чтобы получить результаты запроса, то вы итерацию над курсором:

read_loop: LOOP 
    FETCH results INTO a, b; 
    IF done THEN 
     LEAVE read_loop; 
    END IF; 

    --do your business here with a and b 

END LOOP; 

И, наконец, закрыть курсор:

CLOSE results; 

Надеюсь, это поможет.

+0

Ах спасибо, я попробую его позже. Чтобы многое сделать сейчас, но я скажу вам, если это сработает. – user3793935