2012-06-28 3 views
2

Следующий код должен найти избирателей, которые не имеют почтового голосования, имеют ли телефонные номера не имеющие определенных кодов, перечислены в другой таблице, называемой намерениями для голосования с определенными обещаний или вообще не указаны в этой таблице.mySQL-запрос сложного соединения, производящего случайное и ошибочное число

FROM electors,voting_intention 
WHERE 
    electors.telephone > 0 
    AND electors.postal_vote != 1 
    AND (
    electors.mosaic NOT IN ('E1','E2','E3') 
    OR (
     electors.ID = voting_intention.elector 
     AND voting_intention.pledge IN ('U','W','X') 
    ) 
    OR electors.ID != voting_intention.elector 
) 

На данный момент он производит подсчет более 2 миллионов записей в много раз больше числа в базе данных. Очевидно, что-то не так, но я не вижу своей ошибки.

+1

Помогло бы вам, если бы вы добавили явное СОЕДИНЕНИЕ между таблицей 'избирателей' и' vote_intention'? – andrewsi

+0

Куда бы он пошел –

+0

Добавьте его в инструкцию FROM - 'ИЗ избирателей INNER JOIN vote_intention ON electorsID = vote_intention.elector', я думаю – andrewsi

ответ

1
FROM electors e 
     LEFT JOIN voting_intention v1 ON e.ID = v1.elector AND v1.pledge IN ('U','W','X') 
     LEFT JOIN voting_intention v2 ON e.ID = v2.elector 
WHERE 
    e.telephone > 0 
AND e.postal_vote != 1 /* do not have a postal vote?? */ 
AND (e.mosaic NOT IN ('E1','E2','E3') 
    OR v1.elector IS NOT NULL 
    OR v2.elector IS NULL) 
+0

Похоже, это должно быть одно. Это дает несколько результатов. Это может быть на моем конце, поэтому я просто отлаживаю –

+0

, можете ли вы подтвердить это? e.postal_vote! = 1 – Sebas

+0

Да должно быть! = 1. В этом случае мы не хотим их. v1.elector должен быть TRUE не null, поскольку мы хотим получить результат, если он имеет какие-либо из этих обещаний. Я возвращаю ваш параметр в true, но его все еще дает мне то же самое значение, поэтому я думаю, что что-то другое вызывает здесь проблему. –

1

Похоже, вам не хватает определения соединения между избирателями и voting_intention

я ожидал бы увидеть что-то вроде:

FROM electors e 
INNER JOIN voting_intention v 
    ON v.elector_id = e.id 

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

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