需要帮助MySQL查询和PHP

Mis*_*hko 3 php mysql sql

我有以下3个表格:

(PK =主键,FK =外键)

文件表

File ID (PK)    File Name    ...
------------    ---------
     1            a.jpg      ...
     2            b.png      ...
     3            c.jpg      ...
     .              .
     .              .
     .              .
Run Code Online (Sandbox Code Playgroud)

标签表

Tag ID (PK)   Tag Name       ...
-----------   ----------  
   1          Melbourne      ...
   2          April          ...
   3          2010           ...
   .           .
   .           .
   .           .
Run Code Online (Sandbox Code Playgroud)

Files_Tags表

File ID (FK)    Tag ID (FK)
------------    -----------
      1              1
      1              5
      1              7 
      2              2 
      2              4
      3              3
      .              .
      .              .
      .              .
Run Code Online (Sandbox Code Playgroud)

在PHP中,我想获得所有标签的列表以及标签出现的次数(即具有此标签的文件数).

这可能与一个MySQL查询有关吗?

Mar*_*ers 5

在您的代码ID上尝试GROUP BY.使用LEFT JOIN包含标记表中存在但未使用的标记.

SELECT
    Tag_Name, 
    COUNT(Files_Tags.Tag_ID) AS cnt
FROM Tags
LEFT JOIN Files_Tags
ON Tags.Tag_ID = Files_Tags.Tag_ID
GROUP BY Tags.Tag_ID
Run Code Online (Sandbox Code Playgroud)

结果:

Melbourne  1
April      1
2010       1
...        ...

您可能还想添加一个ORDER BY Tag_Name或一个,ORDER BY COUNT(*)如果您想要按排序顺序返回的行.


Daniel Vassello也提交了一个答案但删除了它.然而,他的答案很容易适应您的新要求.这是他的解决方案,修改为使用LEFT JOIN而不是INNER JOIN:

SELECT t.tag_id,
       t.tag_name,
       IFNULL(d.tag_count, 0) AS tag_count
FROM tags t
LEFT JOIN
(
    SELECT tag_id, COUNT(*) tag_count
    FROM files_tags
    GROUP BY tag_id
) d ON d.tag_id = t.tag_id;
Run Code Online (Sandbox Code Playgroud)