mysql为每个id选择存在计数

8iwquhpp  于 2021-06-21  发布在  Mysql
关注(0)|答案(4)|浏览(493)

我有一张图片表和另一张图片标签表。
我正在尝试编写一个sql查询,它将获得每个图像id的有效标记数。
我最初的尝试是:

SELECT b.ID AS ID,  COUNT(a.ID) AS NUM
FROM tbl_tags a, tbl_images b 
WHERE (
    b.ID = a.IMG_ID AND 
      (a.TAG_NAME LIKE '%scenic%' OR 
       a.TAG_NAME LIKE '%fruit%' OR 
       a.TAG_NAME LIKE '%bench%' OR 
       a.TAG_NAME LIKE '%bird%'
      )
);

结果是:

ID    NUM
7      13

但是,我想要的是显示找到的每个图像id的标记的计数值。我要找的是更像这样的东西:

ID    NUM
3      2     -- Image ID #3 has 2 tags that match the query
68     1     -- Image ID #68 has 1 tag that matches the query
87     3     -- ...
92     2     -- ...
187    1     -- ...
875    2     -- ...
wxclj1h5

wxclj1h51#

你不需要一个 join 因为图像id在 tbl_tags :

SELECT t.IMG_ID AS ID, COUNT(*) AS NUM
FROM tbl_tags t
WHERE t.TAG_NAME LIKE '%scenic%' OR 
      t.TAG_NAME LIKE '%fruit%' OR 
      t.TAG_NAME LIKE '%bench%' OR 
      t.TAG_NAME LIKE '%bird%'
GROUP BY t.img_id;

我强烈建议您对表名使用缩写(例如 t 为了 tbl_tags )而不是武断的信件。它使查询更容易理解。

pxiryf3j

pxiryf3j2#

这里有一个使用 REGEXP 它可以清理 WHERE 有一点:

SELECT
    a.ID,
    COUNT(b.ID) AS NUM
FROM tbl_images a
INNER JOIN tbl_tags b
    ON a.ID = b.IMG_ID
WHERE
    b.TAG_NAME REGEXP 'scenic|fruit|bench|bird'
GROUP BY
    a.ID;
bfhwhh0e

bfhwhh0e3#

喜欢新的(从90年代开始!)联接语法

SELECT b.ID AS ID,  COUNT(a.ID) AS NUM
FROM tbl_tags a
 INNER JOIN tbl_images b on b.ID = a.IMG_ID
…

因为它更清楚。
使用聚合时分组使用 GROUP BY ```
SELECT a.IMG_ID AS ID, COUNT(a.ID) AS NUM
FROM tbl_tags a
WHERE a.TAG_NAME LIKE '%scenic%'
OR a.TAG_NAME LIKE '%fruit%'
OR a.TAG_NAME LIKE '%bench%'
OR a.TAG_NAME LIKE '%bird%'
GROUP BY a.IMG_ID

注意,这里并不需要join,因为您没有使用 `tbl_Images` .
zpf6vheq

zpf6vheq4#

SELECT a.IMG_ID,  COUNT(a.ID) AS NUM
FROM tbl_tags a
WHERE a.TAG_NAME LIKE '%scenic%' OR 
       a.TAG_NAME LIKE '%fruit%' OR 
       a.TAG_NAME LIKE '%bench%' OR 
       a.TAG_NAME LIKE '%bird%'      
Group by a.IMG_ID

相关问题