2015-11-27 2 views
0

У меня есть следующая структура таблицы:Количество MySQL и присоединиться к 4 таблицы

Таблица Папка
id | title | is_hidden

Таблица объект
id | name | is_hidden | folder_id

Таблица этикетки
id | name

Таблица label_to_folder
id | label_id | folder_id

  • Каждый объект всегда принадлежит к папке.
  • Каждая папка может принадлежать к одной или более меток (это определяется по таблице) label_to_folder

Я пытаюсь получить наиболее используемые (популярные) этикетки, и я достигну его (я думаю, : P) с помощью следующего запроса: SELECT COUNT(lf.label_id) AS cnt, lf.label_id, l.name FROM label_to_folder lf JOIN label l ON lf.label_id=l.id GROUP BY lf.label_id ORDER BY cnt DESC limit 8

Что у меня возникают проблемы с, есть степень выше запрос, так что не считается скрытые папки (folder.is_hidden = 1) или пустые папки (пустая папка один без объектов вообще или все объекты папки скрыты)

Любая помощь приветствуется.

EDIT

sqlfiddle: http://sqlfiddle.com/#!9/65526/1 Результат есть включает в себя папку с идентификатором 5, но все его папки пусты - это то, что я пытаюсь устранить.

+0

может вы добавляете некоторые данные, чтобы я мог воссоздать его, чтобы проверить его? – davejal

+0

Простое наблюдение - 'id' в таблице label_to_folder выглядит излишним. Помимо этого, если хотите, рассмотрите следующий простой двухэтапный курс действий: 1. Если вы еще этого не сделали, предоставьте правильные инструкции CREATE и INSERT (и/или sqlfiddle), чтобы мы могли легче реплицировать проблему , 2. Если вы еще этого не сделали, укажите желаемый набор результатов, соответствующий информации, представленной на шаге 1. – Strawberry

+0

@Strawberry Я работаю над скриптом sql – CrisDeBlonde

ответ

1

привыкают папки таким образом:

select f.id 
from folder f 
where f.is_hidden = 0 
and exists 
(
    select * 
    from object o 
    where o.folder_id = f.id 
    and o.is_hidden = 0 
) 

Затем вы можете добавить это к вашему запросу:

where lf.folder_id in (<above subquery>) 
0

Вы попробовали следующий запрос?

SELECT COUNT(lf.label_id) AS cnt 
    , lf.label_id 
    , l.name 
    FROM label_to_folder lf 
    JOIN label l 
    ON lf.label_id = l.id 
    JOIN object o 
    ON o.folder_id = l.folder_id 
    JOIN folder f 
    ON f.id = l.folder_id 
WHERE f.is_hidden = 1 
    AND o.is_hidden = 1 
GROUP 
    BY lf.label_id 
ORDER 
    BY cnt DESC 
LIMIT 8 
1

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

SELECT l.id label_id 
    , l.name label_name 
    , f.id folder_id 
    , f.title folder_title 
    , f.is_hidden folder_is_hidden 
    , o.id object_id 
    , o.name object_name 
    , o.is_hidden object_is_hidden 
    FROM label l 
    JOIN label_to_folder lf 
    ON lf.label_id = l.id 
    JOIN folder f 
    ON f.id = lf.folder_id 
    JOIN object o 
    ON o.folder_id = f.id 
WHERE f.is_hidden = 0 
    AND o.is_hidden = 0 
ORDER 
    BY label_id; 
+----------+------------+-----------+--------------+------------------+-----------+-------------+------------------+ 
| label_id | label_name | folder_id | folder_title | folder_is_hidden | object_id | object_name | object_is_hidden | 
+----------+------------+-----------+--------------+------------------+-----------+-------------+------------------+ 
|  4 | l3   |   4 | Folder 3  |    0 |   6 | object F |    0 | 
|  4 | l3   |   6 | Folder 5  |    0 |   7 | object G |    0 | 
|  4 | l3   |  10 | Folder 9  |    0 |  10 | object J |    0 | 
|  4 | l3   |   6 | Folder 5  |    0 |   9 | object I |    0 | 
|  4 | l3   |  11 | Folder 10 |    0 |  11 | object K |    0 | 
|  4 | l3   |   4 | Folder 3  |    0 |   1 | object A |    0 | 
|  4 | l3   |   4 | Folder 3  |    0 |   2 | object B |    0 | 
|  4 | l3   |   4 | Folder 3  |    0 |   3 | object C |    0 | 
|  4 | l3   |   6 | Folder 5  |    0 |   8 | object H |    0 | 
|  4 | l3   |   4 | Folder 3  |    0 |   4 | object D |    0 | 
|  4 | l3   |   4 | Folder 3  |    0 |   5 | object E |    0 | 
|  6 | l5   |   6 | Folder 5  |    0 |   8 | object H |    0 | 
|  6 | l5   |   4 | Folder 3  |    0 |   1 | object A |    0 | 
|  6 | l5   |   4 | Folder 3  |    0 |   2 | object B |    0 | 
|  6 | l5   |   6 | Folder 5  |    0 |   7 | object G |    0 | 
|  6 | l5   |   4 | Folder 3  |    0 |   3 | object C |    0 | 
|  6 | l5   |   4 | Folder 3  |    0 |   4 | object D |    0 | 
|  6 | l5   |   4 | Folder 3  |    0 |   5 | object E |    0 | 
|  6 | l5   |   4 | Folder 3  |    0 |   6 | object F |    0 | 
|  6 | l5   |   6 | Folder 5  |    0 |   9 | object I |    0 | 
|  9 | l8   |   4 | Folder 3  |    0 |   2 | object B |    0 | 
|  9 | l8   |   4 | Folder 3  |    0 |   3 | object C |    0 | 
|  9 | l8   |   4 | Folder 3  |    0 |   4 | object D |    0 | 
|  9 | l8   |   4 | Folder 3  |    0 |   5 | object E |    0 | 
|  9 | l8   |   4 | Folder 3  |    0 |   6 | object F |    0 | 
|  9 | l8   |   4 | Folder 3  |    0 |   1 | object A |    0 | 
+----------+------------+-----------+--------------+------------------+-----------+-------------+------------------+ 

SELECT l.id label_id 
    , l.name label_name 
    , COUNT(*) total 
    FROM label l 
    JOIN label_to_folder lf 
    ON lf.label_id = l.id 
    JOIN folder f 
    ON f.id = lf.folder_id 
    JOIN object o 
    ON o.folder_id = f.id 
WHERE f.is_hidden = 0 
    AND o.is_hidden = 0 
GROUP 
    BY l.id 
ORDER 
    BY total DESC 
LIMIT 3; 
+----------+------------+-------+ 
| label_id | label_name | total | 
+----------+------------+-------+ 
|  4 | l3   | 11 | 
|  6 | l5   |  9 | 
|  9 | l8   |  6 | 
+----------+------------+-------+ 
+0

Вышеуказанный запрос вычисляет общее количество, подсчитывая объекты, а не папки. Например, label_id 4 (l3) должно иметь в общей сложности 4 (папки 4,6,10 и 11), а не 11 (что является подсчетом объектов этих 4 папок). Это почти приемлемое решение - таким образом, вверх. Большое спасибо за попытку! – CrisDeBlonde

+0

Вы хотите считать только папки, у которых нет «скрытых объектов» или только папки, имеющие «по крайней мере один видимый объект». – Strawberry

+0

Счет ссылается на «используемые» метки по папкам, а не по папкам. В любом случае, ответ Торстен Кеттнера, похоже, работает нормально, так что все в порядке! Еще раз спасибо за помощь! – CrisDeBlonde

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