спецам SQL...

12
[Удален]
792

SQL:

SELECT id, cnt FROM tbl1 t LEFT JOIN (SELECT COUNT(*) as cnt, field FROM tbl2 t2 WHERE t2.field = id) vyborka ON vyborka.field = id WHERE ... и т.д.

выдает Column 'field' cannot be null

почему? Просто голова уже разрывается :( Подскажите пжалста...

Для простоты... в табличке в одной есть люди, которые публикуют объявления (люди: ид человека, имя). Во второй хранятся объявления (объявление, ид объявления, ид человека, давшего объявление). Нужно выбрать всех людей и кол-во их объявлений. Делал уже такое, да и код вроде как верный (судя по ошибке, конечно, НЕ верный)... MySQL, InnoDB.

Делал такое на MyISAM. Может на InnoDB как то по-другому подобная штука делается?...

То есть. Сделать просто выборку по одной таблице и включить в неё кол-во строк из другой таблицы. Где во второй выборке идентификатор из первой таблицы должен быть равен какому то полю из второй таблицы... Вроде же просто всё... но не могу сделать уже часа 2 наверное, если не больше... :(

N
На сайте с 06.05.2007
Offline
419
#1

LEFT уберите.

Кнопка вызова админа ()
V1
На сайте с 30.03.2006
Offline
52
#2

Смотрите результат запроса

SELECT COUNT(*) as cnt, field FROM tbl2 t2 WHERE t2.field = id

его смысл вообще не понятен, скорее всего значение поля field - null

возможно надо так:

SELECT COUNT(*) as cnt, field FROM tbl2 t2 WHERE t2.field = id group by field

So1:

Делал такое на MyISAM. Может на InnoDB как то по-другому подобная штука делается?...

Никакого значения не имеет, скорее всего значения в таблицах разные.

netwind:
LEFT уберите.

бред

[Удален]
#3

netwind Не понял зачем убирать LEFT, если я хочу, чтобы таблица, которая стоит слева оставалась нетронутой. Ну убрал... получил 0 записей. Потому что запрос во втором селекте не проходит а таблицы джойнятся только в том случае, если во второй и в первой таблице однозначно существует инстанция, задаваемая после оператора ON.

Смотрите результат запроса
SELECT COUNT(*) as cnt, field FROM tbl2 t2 WHERE t2.field = id
его смысл вообще не понятен, скорее всего значение поля field - null

Почему не понятен?

Выбрать количество как cnt из tbl2 (присвоить элиас t2) где t2.поле = id из таблицы слева.

Если я подставляю в качестве id существующее значение, - всё прекрасно получается, но тогда в результате у меня получится куча записей, для которых только для одного идентификатора выводится кол-во присутствия в поле field второй таблицы.

Мозг начинает взрываться :)

Vladimir1:
Никакого значения не имеет, скорее всего значения в таблицах разные

я тоже думаю, что значения не имеет, - просто предположил уже почти от безысходности :) Ну не то чтобы именно от нее - я в любом случае могу сделать выборку, а потом для каждого пользователя проверить сколько у него сообщений (объявлений и т.д.)... Хотелось бы просто одним запросом бахнуть всё. Ведь 1 итак небольшой всяко лучше 200 чуть поменьше...

V1
На сайте с 30.03.2006
Offline
52
#4

а если вместо id подставить null?

сделайте

SELECT field FROM tbl2 t2 where field is null

если количество записей отлично от нуля - проблема в этих записях, mysql не хочет джоинить записи по null.

вообще правильней подсчитать количество присоединенных записей без вложенного запроса:

select a.id,count(*)

from a

inner join u on u.id=a.assigned_id

group by a.id

[Удален]
#5
Vladimir1:
а если вместо id подставить null?

сделайте
SELECT field FROM tbl2 t2 where field is null

если количество записей отлично от нуля - проблема в этих записях, mysql не хочет джоинить записи по null.

is null - нет записей.

is not null - навалом.

То есть во второй таблице (которую джойню) поле feld всегда не ноль.

НО! Если я делаю запрос ко второй табле вот так:

SELECT * FROM tbl2 where field is not null

то получаю все записи tbl2 и в поле field (ну я же не слепой) вижу нормальные целые значения.

Если я делаю

SELECT field FROM tbl2 where field is not null

то получаю кучу результатов (собственно количество равно кол-ву записей в таблице), НО field = 0! Шо за пакость? ((

N
На сайте с 06.05.2007
Offline
419
#6
So1:
Ну убрал... получил 0 записей.

Ну так у вас противоречивые данные или вы перепутали поля в выражении ON. Убрать LEFT полезно с точки зрения проверки на адекватность. Как может быть 0 записей, если некоторые пользователи обязательно оставили сообщения ?

Выкладывайте дамп, короче. Иначе гадать будем долго.

V1
На сайте с 30.03.2006
Offline
52
#7
So1:
is null - нет записей.
is not null - навалом.

То есть во второй таблице (которую джойню) поле feld всегда не ноль.

НО! Если я делаю запрос ко второй табле вот так:
SELECT * FROM tbl2 where field is not null
то получаю все записи tbl2 и в поле field (ну я же не слепой) вижу нормальные целые значения.
Если я делаю
SELECT field FROM tbl2 where field is not null
то получаю кучу результатов (собственно количество равно кол-ву записей в таблице), НО field = 0! Шо за пакость? ((

смотрим что выдает :)

SELECT field FROM tbl2 where field=0

вообще такой запрос у меня не проходит

select name,count(*)

from accounts a

MySQL Database Error: Mixing of GROUP columns (MIN(),MAX(),COUNT(),...) with no GROUP columns is illegal if there is no GROUP BY clause

Да и такой запрос не имеет смысла, т.к. использование агрегатных функций подразумевает group by.

Попробуйте sql из моего предыдущего поста.

[Удален]
#8
Vladimir1:

вообще правильней подсчитать количество присоединенных записей без вложенного запроса:
select a.id,count(*)
from a
inner join u on u.id=a.assigned_id
group by a.id

ай шайтан! Заработало.

Спасибо - буду знать :)

So1 добавил 29.09.2009 в 11:49

netwind:
Ну так у вас противоречивые данные или вы перепутали поля в выражении ON.

Ничего не путал. Я не могу сидеть и путать 3 часа подряд. Импортнул пачку записей на другой хост - там этот запрос работает прекрасно. Что тут - я даже догадываться не могу.

А вообще всегда выбирал кол-во записей подобным запросом. Пусть немного неправильно, но написано самостоятельно после некоторых раздумий и работает. Работает при том не просто на ГСах, а на вполне приличных порталах. Как видно теперь - работает не везде.

V1
На сайте с 30.03.2006
Offline
52
#9

Учтите, что выводит только те записи, у которых есть присоединенные.

N
На сайте с 06.05.2007
Offline
419
#10

So1, ну так и выложили бы дамп. кто-нибудь обратил бы внимание на настройку сервера sql_mode

Кстати inner join это самый настоящий join без left. Как же вы без left теперь ?

12

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