SQL LIMIT не возвращает результатов, при которых LIMIT не возвращает результаты

SELECT * FROM mm_tfs 
WHERE product_slug LIKE '%football%' 
    AND schoolid = '8' AND category_id ='21'
LIMIT 4

Возвращает 4 значения, как я спрашиваю, но следующий оператор возвращает 0 - существует ли правило об использовании оператора OR, с которым я не знаком? Мое предположение состоит в том, что оно должно возвращать все значения в 1 (или больше, если бы не предел).

SELECT * FROM mm_tfs 
WHERE (product_slug LIKE '%football%' 
   AND schoolid = '8' AND category_id ='21') 
OR (product_description LIKE '%football%' 
   AND schoolid = '8' AND category_id ='21') 
LIMIT 4

ПРИМЕЧАНИЕ by cyberkiwi Первая часть OR Q2 точно такая же, как предложение WHERE в Q1

product_description LIKE '%football%' AND schoolid = '8' AND category_id ='21

Без инструкции OR сама по себе делает желаемый результат, если у него нет предела. Когда инструкция OR используется вместе с LIMIT, возвращается 0 значений.

SELECT * FROM mm_tfs 
WHERE product_description LIKE '%football%' 
    AND schoolid = '8' AND category_id ='21'
LIMIT 4

^ - Это дает 0 результатов

SELECT * FROM mm_tfs 
WHERE product_description LIKE '%football%' 
    AND schoolid = '8' AND category_id ='21'

^ - Это дает результаты

Самая странная часть этого заключается в том, что все эти запросы обрабатывают правильный эффект в моем окне запросов PHPMYADMIN SQL, но не в самом приложении.

Ответ 1

Вы повторяете некоторые из условий, которые не нужны. Вместо этого попробуйте:

SELECT * FROM mm_tfs 
WHERE 
   (product_slug LIKE '%football%' 
 OR product_description LIKE '%football%')
   AND schoolid = '8' 
   AND category_id ='21'
LIMIT 4

UPDATE:

Я создал следующую таблицу:

create table mm_tfs2 (schoolid varchar(2), categoryid varchar(2), 
                      description varchar(20), slug varchar(20));

И 5 раз:

insert into mm_tfs2 values (8, 21, '', 'football');

И, наконец, запрос:

select * from mm_tfs2 where 
(slug like '%football%' and schoolid = 8 and categoryid = 21) 
or (description like '%football%' and schoolid = 8 and categoryid = 21) 
limit 4;
+----------+------------+-------------+----------+
| schoolid | categoryid | description | slug     |
+----------+------------+-------------+----------+
| 8        | 21         |             | football |
| 8        | 21         |             | football |
| 8        | 21         |             | football |
| 8        | 21         |             | football |
+----------+------------+-------------+----------+
4 rows in set (0.00 sec)

Поэтому мне жаль говорить, что я не могу воссоздать проблему.

Ответ 2

Попробуйте поставить() arround на все условие

( (...AND...) OR (...AND...) )

Так же:

  SELECT * FROM mm_tfs WHERE 
  (  (product_slug LIKE '%football%' AND schoolid = '8' AND category_id ='21') 
   OR (product_description LIKE '%football%' AND schoolid = '8' AND category_id   
   ='21')
  ) LIMIT 4

Ответ 3

Я думаю, что вы можете немного почистить его, вы получаете только строки для одной школы и один идентификатор категории, поэтому нет причин, по которым вам нужно будет проверять эти оба раза:

SELECT *
FROM mm_tfs
WHERE schoolid = '8'
    AND category_id ='21'
    AND (product_slug LIKE '%football%'
         OR product_description LIKE '%football%')
LIMIT 4;