2011-01-25 4 views
11
SELECT * FROM mm_tfs 
WHERE product_slug LIKE '%football%' 
    AND schoolid = '8' AND category_id ='21' 
LIMIT 4 

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

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 

Примечание по cyberkiwi первого или части Q2 точно такие же, как ИНЕКЕ на Q1

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

без ИЛИ Заявления самого по себе получение желаемого результата до тех пор, так как он не имеет предела. Когда оператор 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-запрос, но не в самом приложении.

+0

Выбирает логическую ошибку, а не конкретную для OR. Оберните все вокруг фигурных скобок, это все ваше состояние вокруг (и). – JonH

+0

Нет, он возвращает значения –

+1

Это очень интересно. Может ли кто-нибудь объяснить, почему это неправильно, вместо альтернативного подхода? +1 – Nishant

ответ

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

Хотя это правда, объясняет, почему запрос doesn ' т работы? – RichardTheKiwi

+0

@cyberwiki: позволяет увидеть ваш ответ, умные штаны: p – VoodooChild

+0

интересно, что случилось с OP-запросом? – Nishant

1

Try положить() 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 
+0

Нет, не меняет набор результатов с 0 –

+0

Нужны ли эти скобки, если у него не было утверждения 'LIMIT 4'? – VoodooChild

+0

@Bob Cavezza - Исключить мелкие кусочки, чтобы увидеть проблему. Например, избавьтесь от 2 AND от части OR и получите ее просто или product_description LIKE '% football%' ... Затем посмотрите, возвращаются ли какие-либо строки. Я бы использовал (и) еще несколько. Эти AND и ORs могли бы испортить это для ya ... – JonH

1

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

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

Хм, избитый Клаусом. В следующий раз нужно быть быстрее. : P – bhamby

+0

LOL @ galador, вы все время в мире объясняете WTH здесь (см. Комментарии в OP). Я буду поддерживать его. – Nishant

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