PHP-запрос с использованием оператора WHERE, AND & OR - PullRequest
0 голосов
/ 06 октября 2011

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

if ($result = $mysqli->query("SELECT 
orderheader.ordernumber As Order_Number
, ccilog.orderid AS Order_ID
, orderheader.billingcontactfirstname AS Customer_Name
, orderheader.billingcontactlastname AS Customer_Surname
, orderheader.billingcustomeremailaddress AS Customer_Email
, orderheader.webbrandcode AS Brand_Code
, orderitems.productname AS Product_Name
, orderitems.qty AS Item_Qty
, orderheader.datecreated AS Order_Date 
FROM orderheader 
LEFT JOIN ccilog ON orderheader.id=ccilog.orderid
LEFT JOIN orderitems ON ccilog.orderid=orderitems.orderid 
WHERE orderitems.status = '0' 
AND orderheader.status != '1'
AND orderitems.webbrandcode = 'brand1' || orderitems.webbrandcode = 'brand2' 
AND orderheader.billingcustomeremailaddress != 'email1@email.co.uk'
AND orderheader.billingcustomeremailaddress != 'email2@email.co.uk'
"))

Если удалить строку:

AND orderitems.webbrandcode = 'brand1' || orderitems.webbrandcode = 'brand2' 

Мои результаты отображаются нормальнои мои правила работают с отображением Brand1, 2 и 3. Когда я добавляю вышеупомянутую строку, я ожидаю увидеть те же результаты, но без бренда 3. Brand 3 не показывает, что замечательно, но кажется, что теперь он перечисляет всебренд 2, а не только строки, в которых предыдущие утверждения статуса заказа верны.

Я не могу понять, почему мои результаты не просто возвращают 11 ожидаемых результатов (это возвращает 425), почти большинство результатов бренда 2.

Ответы [ 3 ]

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

Вы пропускаете скобки вокруг предложения OR ... оно должно читаться следующим образом:

(orderitems.webbrandcode = 'brand1' || orderitems.webbrandcode = 'brand2')

Если вы не ставите скобки, тогда ограничения связываются с использованием приоритета оператора, который может не соответствоватьВы намерены!

0 голосов
/ 06 октября 2011

попробуйте

....AND orderheader.status != '1'
AND ( orderitems.webbrandcode = 'brand1' || orderitems.webbrandcode = 'brand2' )
AND orderheader.billingcustomeremailaddress != 'email1@email.co.uk'...
0 голосов
/ 06 октября 2011

Попробуйте это:

if ($result = $mysqli->query("SELECT 
orderheader.ordernumber As Order_Number
, ccilog.orderid AS Order_ID
, orderheader.billingcontactfirstname AS Customer_Name
, orderheader.billingcontactlastname AS Customer_Surname
, orderheader.billingcustomeremailaddress AS Customer_Email
, orderheader.webbrandcode AS Brand_Code
, orderitems.productname AS Product_Name
, orderitems.qty AS Item_Qty
, orderheader.datecreated AS Order_Date 
FROM orderheader 
LEFT JOIN ccilog ON orderheader.id=ccilog.orderid
LEFT JOIN orderitems ON ccilog.orderid=orderitems.orderid 
WHERE orderitems.status = '0' 
AND orderheader.status != '1'
AND (orderitems.webbrandcode = 'brand1' || orderitems.webbrandcode = 'brand2')
AND orderheader.billingcustomeremailaddress != 'email1@email.co.uk'
AND orderheader.billingcustomeremailaddress != 'email2@email.co.uk'
"))

См .:

Вы также можете комбинировать AND и OR (использовать скобки для формирования сложных выражений).

SELECT * FROM Persons WHERE
LastName='Svendson'
AND (FirstName='Tove' OR FirstName='Ola')

-> http://www.w3schools.com/sql/sql_and_or.asp

...