2015-11-27 87 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)或空文件夾(空文件夾被一個沒有任何對象或所有文件夾的對象被隱藏)

任何幫助表示讚賞。

編輯

sqlfiddle:http://sqlfiddle.com/#!9/65526/1 有包括id爲5的文件夾,但它的所有文件夾都是空的結果 - 這就是我試圖消除。

+0

could你添加一些數據,所以我可以重新創建它來測試它? – davejal

+0

只有觀察 - label_to_folder表中的'id'看起來是多餘的。除此之外,如果您願意,可以考慮遵循以下簡單的兩步式操作: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個文件夾的對象的計數)。這幾乎是一個可以接受的解決方案 - 因此是upvote。儘管如此,非常感謝! – CrisDeBlonde

+0

是否只計算具有「無隱藏對象」的文件夾或僅包含具有「至少一個可見對象」的文件夾 – Strawberry

+0

計數會受到文件夾「使用」標籤的影響,而不是文件夾本身。 無論如何,Thorsten Kettner的答案似乎工作正常,所以沒關係! 再次感謝您的幫助! – CrisDeBlonde