Расширенный поиск Запрос с несколькими INNER JOIN не работает должным образом - PullRequest
1 голос
/ 29 октября 2011

Структура


участников id (auto, int), fullName (varchar), isReseller (enum), reseller_id (int), country_id, city_id, town_id, landLine, admin (enum)

подписок id (авто, int), транзакция_id (int), magazine_id (int), груз (varchar), startDate (дата), endDate (дата), активный (перечисление), статус (перечисление) ), reseller_id (int), member_id (int)

транзакции id (auto, int), bankaccount_id (int), member_id (int), creator_admin_id (int), paymentDate (date)

журналы id (auto, int), имя (varchar)

bankaccounts id (auto, int), имя (varchar)

Запрос


SELECT 

s.id, s.cargo, s.startDate, s.endDate, s.active, s.status, 
mag.name as magazineName, 
b.name as bankName, t.id as transaction_id, 
m.fullName, m.id as member_id, 
mm.fullName as resellerName, mm.id as reseller_id 

FROM  asw_subscriptions as s 
INNER JOIN  asw_members as m ON m.id = s.member_id 
INNER JOIN  asw_transactions as t ON t.id = s.transaction_id 
INNER JOIN  asw_members as mm ON mm.id = t.member_id 
INNER JOIN  asw_magazines as mag ON mag.id = s.magazine_id 
INNER JOIN  asw_bankaccounts as b ON b.id = t.bankaccount_id 

WHERE 

m.fullName LIKE '%john%' AND 
m.country_id = '224' AND  
m.admin = '0'  AND 
m.reseller_id = '45677' AND 
s.magazine_id = '1' AND 
s.active = '1'  AND 
s.reseller_id = '45677' AND 
t.paymentDate BETWEEN '2011-10-01' AND '2011-10-29'  AND 
t.creator_admin_id = '45677' OR 
t.member_id = '45677' 

ORDER BY id DESC LIMIT 0, 25

ПРОБЛЕМА


  1. Реселлеры могут размещать заказы для других участников.
  2. Я держу реселлеров в той же базе данных, что и участники. Значение isReseller равно 1.
  3. Если у участника есть посредник, reseller_id больше 0 (значение идентификатора участника посредника).
  4. Когда посредник размещает заказ, он также создает запись транзакции.

Приведенный выше запрос показывает, что каждый заказ на подписку выполняется реселлером, независимо от каких-либо критериев поиска участников и статуса подписки (при поиске active = '1' все равно отображаются все).

Даже если я напишу Джону, он покажет все заказы выбранного реселлера.

Это похоже на то, как если бы я сделал запрос только для поиска заказа посредника с указанными датами оплаты (t.paymentDate BETWEEN '2011-10-01' AND '2011-10-29').

Я не знаю, как объяснить эту ситуацию. Если я не понял, пожалуйста, дайте мне знать, я постараюсь отредактировать свой вопрос и быть более конкретным.

Заранее спасибо.

Ответы [ 2 ]

1 голос
/ 29 октября 2011

Ваше внутреннее объединение:

INNER JOIN  asw_members as mm ON mm.id = t.member_id

уже гарантирует, что t.member_id = mm.id, поэтому добавление точно такого же условия в предложение where в операторе OR гарантирует, что вы получите полный набор на основеприсоединения одни.См. Ответ о скобках выше.

Если mm является реселлером, а m является участником, я думаю, вы хотите следующее:

INNER JOIN asw_members as mm ON (mm.id = t.member_id OR t.member_id = mm.id)

Тогда в предложении WHERE:

m.reseller_id = mm.id AND
s.reseller_id = mm.id AND
mm.id = '45677' AND
....<other filters>

Иногда, если вы собираетесь присоединиться к столу дважды, вам может понадобиться сократить число своих посредников как r, а участников - как m.Это помогает вспомнить, кто есть кто.

1 голос
/ 29 октября 2011

Мне неясно, какие именно данные вы хотите вернуть, но я думаю, что, возможно, вам следует присоединиться к транзакциям в участниках (только один раз), а затем выполнить некоторую группировку для подсчета заказов (если это то, что вам нужно) , Также обратите внимание, что AND оценивается перед OR - так что окончательный оператор OR против всех AND, оцененных вместе. Используйте скобки (), чтобы правильно сгруппировать операторы OR / AND / BETWEEN.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...