Не работает сложный SQL Запрос

G
На сайте с 24.10.2009
Offline
51
1018

SELECT COUNT(a.id) FROM chu_logs AS a LEFT JOIN chu_users AS b ON (a.uid=b.id) 
WHERE 1=1
AND ( a.`type` LIKE 'carbaseedit_upload_csv' AND a.`type` LIKE 'carbase_search_carnum' AND 1=1)
AND (1=1 AND a.`uid`=58 AND a.`uid`=57 AND a.`uid`=53 AND a.`uid`=52)
AND ( b.`company`=11 AND b.`company`=13 AND 1=1)
AND (a.`date` BETWEEN 0 AND 2177280000)

Вторая таблица используется для поиска по компании, так как в первой она не указана.

В первой указан пользователь, для которого указана компания во второй таблице.

Если В скобках AND больше одного, то вытаскивает 0.

В чем моя ошибка?

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

ДП
На сайте с 23.11.2009
Offline
203
#1

У вас в скобках условие И на одно и то же поле - а значения разные, то есть вы ищете запись, где (например) a.`uid`=58 AND a.`uid`=57 - одновременно. Например, у одной записи это значение будет 57, то условие a.`uid`=58 - не выполнится и вся скобка будет false.

Судя по 1=1 вы запросы генерируете, если вам надо узнать для нескольких значений - то используйте OR между ними или a.`uid` IN (57,58,53)

Если хотите OR - то можно положить все нужные значения в массив, а воптом join его через ' or ' сделать, если на php.

G
На сайте с 24.10.2009
Offline
51
#2

Почему

a.`uid`=58 AND a.`uid`=57 - одновременно
- ошибочно?

Это ведь не переменная.

Мы вытаскиваем значения равные 57, а так же 58.

Разве не так?

C
На сайте с 04.02.2005
Offline
277
#3

и вдогонку...

Кто-нибудь может мне объяснить вот это вот:

1=1

Chukcha добавил 16.11.2010 в 21:52

Gaaarfild,

Ваш пример - взаимосиключаемы

У Вас не может быть одновременно и 2 и 3 яблока

У вас может быть или 2 или 3 яблока.

N
На сайте с 06.05.2007
Offline
419
#4
Chukcha:
1=1

так делают если условия выборки конструируются динамически в программе


$sql='...WHERE 1=1 ';
if (...) { $sql .= "AND a.`date` BETWEEN 0 AND $date"; }
if (...) { $sql .= "AND ...
Кнопка вызова админа ()
G
На сайте с 24.10.2009
Offline
51
#5

1=1 - это заглушка. Когда генерируешь запрос через цикл, как-то необходимо завершить его корректно. Он же не может закончится на AND,

ДП
На сайте с 23.11.2009
Offline
203
#6
Gaaarfild:
Почему - ошибочно?
Это ведь не переменная.
Мы вытаскиваем значения равные 57, а так же 58.
Разве не так?

Нет, в данном случае AND означает что будут искаться строки у которых одновременно выполняются эти условия. Попробуйте на какой-нибудь просто табличке с несколькими полями.

Если поставить это условие на разные поля - типа


a.`type` LIKE 'carbaseedit_upload_csv' AND a.`uid`=57

То выберутся строки, в которых поле type LIKE carbaseedit_upload_csv И поле uid = 57

А если :


a.`uid`=58 AND a.`uid`=57

то надо чтобы поле было равно 57 и 58 одновременно у одной строки (кортеж это вроде зовется) - чего быть не может.

G
На сайте с 24.10.2009
Offline
51
#7

Действительно ошибка в этом. Решил тем, что выставил в скобках вместо AND - OR.

И все заработало абсолютно правильно.

Спасибо за помощь.

ДП
На сайте с 23.11.2009
Offline
203
#8

Вообще странно, что все работает правильно, ведь условие 1=1 будет выполняться всегда - то есть смысла в остальных условиях в этой скобке нет.

WT
На сайте с 08.10.2010
Offline
17
#9
Дикий пионер:
Вообще странно, что все работает правильно, ведь условие 1=1 будет выполняться всегда - то есть смысла в остальных условиях в этой скобке нет.

Помимо 1=1 там еще есть условия, связанные через AND, поэтому выражение в скобках не всегда будет истинным

За еду не работаю, зарабатываю здесь (http://www.sape.ru/r.amStvLXttk.php) Работа для ленивых - продвигай сайты автоматически (http://seopult.ru/ref.php?ref=1f6f897913cc593f)
ДП
На сайте с 23.11.2009
Offline
203
#10
Gaaarfild:
Действительно ошибка в этом. Решил тем, что выставил в скобках вместо AND - OR.
И все заработало абсолютно правильно.
WebTih:
Помимо 1=1 там еще есть условия, связанные через AND, поэтому выражение в скобках не всегда будет истинным

По словам ТС там AND больше нет, впрочем если все работает как надо - смысла дальше обсуждать особо нет.

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий