【问题标题】:count on column filter by where greater than依靠大于的列过滤器
【发布时间】:2013-01-27 16:17:57
【问题描述】:

谁能告诉我下面的正确 MySQL 语法

SELECT ta.id, 
       ta.raw,
       ta.title, 
       ta.hits as tag_hits, 
       it.hits as image_tag_hits,

       (SELECT count(*) 
        FROM image_tag 
        WHERE image_tag.tag_title_id = ta.id) as tag_count
FROM tag_title ta
INNER JOIN image_tag it ON ta.id = it.tag_title_id
INNER JOIN image im ON it.image_id = im.id
WHERE im.id = '12975' AND tag_count >0;

非常感谢

【问题讨论】:

  • HAVING tag_count>0。但更好的方法是加入子表
  • 为什么加入子表是一种更好的方法
  • 更快 - 每个标签都有 1 个子查询而不是 X 个子查询。检查我的答案。

标签: mysql join inner-join


【解决方案1】:

试试having:

SELECT ta.id, ta.raw,ta.title, ta.hits as tag_hits, it.hits as image_tag_hits,
(SELECT count(*) from image_tag where image_tag.tag_title_id = ta.id) as tag_count
FROM tag_title ta
INNER JOIN image_tag it ON ta.id = it.tag_title_id
INNER JOIN image im ON it.image_id = im.id
WHERE im.id = '12975' 
group by ta.id, ta.raw, ta.title, ta.hits, it.hits
having tag_count >0;

如果你想保留where,你也可以这样做:

    SELECT * FROM (
    SELECT ta.id, ta.raw,ta.title, ta.hits as tag_hits, it.hits as image_tag_hits,
    (SELECT count(*) from image_tag where image_tag.tag_title_id = ta.id) as tag_count
    FROM tag_title ta
    INNER JOIN image_tag it ON ta.id = it.tag_title_id
    INNER JOIN image im ON it.image_id = im.id
    WHERE im.id = '12975' )X
   WHERE X.tag_count >0;

【讨论】:

  • 您不需要group by,因为我在回答中提到了having。分组依据是额外添加的。我怀疑这需要否决票:$
  • 为什么还要group by ta.id, ta.raw, ta.title, ta.hits, it.hits回答?
  • 如果他想要Peter,他可以删除,可惜MYSQL在aggregation functions方面非常宽容,所以作为规范,我保留group by。再次强调,如果 OP 想要他可以删除它。
  • 如果你的查询中没有聚合函数我还是不知道为什么group by(我不是在说子查询)
  • @PeterSzymkowski 我已经解释了为什么我在这里使用 group by。我的回答是正确的,事实上这两种方法都是正确的。我只是没有足够的时间给 sqlfiddle OP。所以我仍然不知道为什么要投反对票...
【解决方案2】:

试试这个::

SELECT 
ta.id, 
ta.raw,
ta.title, 
ta.hits as tag_hits, 
it.hits as image_tag_hits, 
count(ta.id) as tag_count 
FROM tag_title ta 
INNER JOIN image_tag it ON ta.id = it.tag_title_id 
INNER JOIN image im ON it.image_id = im.id 
INNER JOIN image_tag ON image_tag.tag_title_id = ta.id
WHERE im.id = '12975'
GROUP BY ta.id having tag_count >0 

【讨论】:

  • 他想要COUNT(*) 来自image_tag 而不是tag_title
  • @PeterSzymkowski:如果你仔细观察表结构,ta.id 等于 image_tag.tag_title_id 所以在进行内部连接时,对两个列进行计数会得到相同的结果
  • 不相等 我相信这是一对多的关系,这就是他使用 COUNT(*) 的原因 他可能在 tag_title 中有 1 行和 100 行在image_tag
  • 它是多对多的关系。一个图像可以有许多标签,一个标签可以属于许多图像。 image_tag 表是关系的许多部分
【解决方案3】:

我不知道您的数据库是什么样的,但我相信您正在寻找该解决方案:

SELECT
    ta.id, 
    ta.raw,
    ta.title, 
    ta.hits as tag_hits, 
    it.hits as image_tag_hits,
    COUNT(*) as tag_count
FROM
    image_tag it
LEFT JOIN
    tag_title ta ON
    ta.id = it.tag_title_ID
LEFT JOIN
    image im ON it.image_id = im.id
WHERE
    im.id = 12975
    # not need for tag_count=0, because if there is no image_count there will be no row :)
GROUP BY
    it.tag_title_id

还有你的查询(固定)

SELECT
    ta.id, 
    ta.raw,
    ta.title, 
    ta.hits as tag_hits, 
    it.hits as image_tag_hits,
    tcount.tag_count
FROM
    tag_title ta
LEFT JOIN
    ( 
    SELECT 
        tag_title_id,
        count(*) as tag_count
    FROM 
        image_tag 
    GROUP BY
        tag_title_id
    ) tcount ON tcount.tag_title_id = ta.id
INNER JOIN image_tag it ON ta.id = it.tag_title_id
INNER JOIN image im ON it.image_id = im.id
WHERE im.id = '12975' AND tcount.tag_count >0;

【讨论】:

    猜你喜欢
    • 2021-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-12
    • 2017-08-17
    • 2019-02-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多