Кто силен в mySQL?

Lord Maverik
На сайте с 15.04.2003
Offline
471
596

Вот запрос:

SELECT count( * )
FROM cms_catalog_list AS cl, cms_catalog_cats AS cats
WHERE `actv` = '1'
AND (
(
`cl`.`id_cat` =43
)
OR (
`cats`.`id_cat` = '43'
AND `cl`.`id` = `cats`.`id_list`
)
)
GROUP BY cl.id
LIMIT 0 , 30

cms_catalog_list - таблица записей

у каждой записи есть id раздела - id_cat, поле actv и еще там всякие поля.

cms_catalog_cats - таблица доплнительных разделов

состоит из id_list - номера записи и id_cat - номера раздела.

В данном примере цирфа 43, просто номер просматриваемого раздела.

В таблице 13 записей с разделом 43.

И в таблице дополнительных разделов указано, что к 43-му еще одна принадлежит запись.

И так в чем трабла. Если делать запрос count(*) то выдает 27 записей.

В phpmyadmin выводит 14 строк, в 13-ти стоит 2, в 14-м 1.

Если заменить count(*) на просто * выводит искомые 14 записей и ничего более. Что за хрень?

P.S. Кавычки не везде, пальцем не тыкать :)

RedMall.Ru (https://redmall.ru) - Товары из Китая (Таобао, Tmall) с проверкой качества, скидка для форумчан 7% Партнерская программа 2 уровня: 5% + 5%. Подробнее. (https://redmall.ru/about/partner/)
[Удален]
#1

был бы дампик поиграться, а то так непонятно)

J
На сайте с 02.02.2009
Offline
53
#2

Если надо выбрать количество сообщений для каждой рубрики, то

SELECT count(*),cats.id

FROM cms_catalog_list cl

INNER JOIN cms_catalog_cats cats

ON cats.id_list = cl.id

WHERE cl.`actv` = '1'

GROUP BY cats.id

как-то так, если я правильно структуру понял

Lord Maverik
На сайте с 15.04.2003
Offline
471
#3

jumash, не, такой вариант никак не катит.

Lord Maverik добавил 05.02.2009 в 12:30

bearman:
был бы дампик поиграться, а то так непонятно)

Немогу пока дампик сделать.

Lord Maverik добавил 05.02.2009 в 12:33

Я логически понимаю в чем прикол.

То что каждый раз выбирая записи, мы получаем пару из первой и второй таблицы, потому идет 2-ка, на последней записи там одна пара. Это из за условия или.

Как изменить, незнаю-что :(

Я не знаю, понял ли меня кто :)

J
На сайте с 02.02.2009
Offline
53
#4

Сделай хотя бы руками пример БД с данными=) Тогда будет более-менее понятно)

И ожидаемый результат в примере

Cheltap
На сайте с 27.11.2008
Offline
30
#5
Lord Maverik:
Вот запрос:

SELECT count( * )

FROM cms_catalog_list AS cl, cms_catalog_cats AS cats
WHERE `actv` = '1'
AND (
(
`cl`.`id_cat` =43
)
OR (
`cats`.`id_cat` = '43'
AND `cl`.`id` = `cats`.`id_list`
)
)
GROUP BY cl.id
LIMIT 0 , 30


select cl.id, count(*)
from cms_catalog_list AS cl
left outer join cms_catalog_cats AS cats on (cl.id = cats.id_list)
where ( (actv = 1) and ((cl.id_cat =43) or (cats.id_cat = 43)) )
group by cl.id
limit 0 , 30

или right outer join

короче, если имеется group by, то все столбцы, указанные в нём,

должны обязятельно быть в списке выбираемых + count(*)

-
На сайте с 07.12.2005
Offline
97
-K-
#6

БД спроектирована не верно! Или у каждой записи может быть только один раздел и его ID хранится в таблице cms_catalog_list и таблица cms_catalog_cats не нужна либо у каждой записи может быть несколько разделов - в таком случае в табличке с записями не нужно хранить ID какого то одного раздела, а дополнительные в отдельной табличке - все разделы хранить в таблице связей (у вас как я понял cms_catalog_list).

У вас явно что то избыточное - или поле ID раздела в таблице записей или таблица связей.

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

Lord Maverik
На сайте с 15.04.2003
Offline
471
#7

-K-, в большинстве случаев идет жесткая связь 1 к 1. 1 ко многим применяется достаточно редко, потому идет как дополнение. Т.е. это дело можно включить, а можно отключить.

Поизучаю операторы join, главное чтобы работало быстра еще при этом.

Lord Maverik добавил 06.02.2009 в 07:32

В общем я выяснил, что мой запрос вообще нифига не работает толком :(

И сделал как посоветовал -K-, изменил связи таблиц на 1 ко многим, и теперь одним простым запросом все данные легко выбираются.

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