【问题标题】:Select Count of Rows with Joined Tables选择连接表的行数
【发布时间】:2013-02-26 14:23:31
【问题描述】:

我有两个具有一对多关系的表。我通过 id 列加入表格。我的问题是我需要计算第二个(tablekey_id)表中所有匹配条目的数量,但我需要标有布尔值is_basedomain 的行中的信息。请注意,每组具有相同 tablekey_id 的行只有一行 is_basedomain = 1。

表格:tablekey

id  linkdata_id  timestamp
22  9495028175   2013-03-10 01:13:46
23  8392740179   2013-03-10 21:23:25

表:searched_domains。

注意:tablekey_id 是 tablekey 表中 id 的外键。

id  tablekey_id  domain        is_basedomain
1   22           somesite.com  1
2   22           yahoo.com     0
3   23           red.com       1
4   23           blue.com      0
5   23           green.com     0

这是我正在使用的查询。我试图使用子查询,但我似乎无法只选择当前 tablekey_id 的计数,所以这不起作用。

SELECT `tablekey_id`, `linkdata_id`, `timestamp`, `domain`, `is_basedomain`,
   (SELECT COUNT(1) AS other FROM `searched_domains` AS dd 
    ON dd.tablekey_id = d.tablekey_id GROUP BY `tablekey_id`) AS count
FROM `tablekey` AS k 
JOIN `searched_domains` AS d
ON k.id = d.tablekey_id 
WHERE `is_basedomain` = 1 GROUP BY `tablekey_id`

我想得到的结果是:

tablekey_id  linkdata_id  timestamp            domain        is_basedomain    count
22           9495028175   2013-03-10 01:13:46  somesite.com  1                2
23           8392740179   2013-03-10 21:23:25  red.com       1                3

谁能帮我在一个查询中解决这个问题?

【问题讨论】:

    标签: mysql join count


    【解决方案1】:

    您可以将 is_basedomain=1 的 searched_domains 行视为查询中的单独表,并将其与 searched_domains 的另一个实例连接(以获取计数):

    SELECT 
        d.tablekey_id, 
        k.linkdata_id, 
        k.timestamp,  
        d.domain, 
        d.is_basedomain, 
        COUNT(*) as 'count'
    FROM 
        tablekey AS k
          join searched_domains AS d on d.tablekey_id=k.id
          join searched_domains AS d2 on d2.tablekey_id=d.tablekey_id
    WHERE 
        d.is_basedomain = 1 
    GROUP BY 
        d.tablekey_id, 
        k.linkdata_id, 
        k.timestamp,  
        d.domain, 
        d.is_basedomain
    

    【讨论】:

      【解决方案2】:

      使用ON 代替WHERE 时出现错误

      试试这个

          SELECT `tablekey_id`, `linkdata_id`, `timestamp`, `domain`, `is_basedomain`,
          (SELECT COUNT(1) AS other FROM `searched_domains` AS dd 
          where dd.tablekey_id = d.tablekey_id GROUP BY `tablekey_id`) AS count
      
          FROM `tablekey` AS k 
          JOIN `searched_domains` AS d
          ON k.id = d.tablekey_id 
          WHERE `is_basedomain` = 1 GROUP BY `tablekey_id`
      

      DEMO HERE

      【讨论】:

        【解决方案3】:

        没有理由使用子查询,或者你的意见是什么?

        SELECT 
            `tablekey_id`, 
            `linkdata_id`, 
            `timestamp`,  
            `domain`, 
            `is_basedomain`, 
            COUNT(*) as count
        FROM 
            `tablekey` AS k , 
            `searched_domains` AS d
        WHERE 
            k.id = d.tablekey_id AND 
            `is_basedomain` = 1 
        GROUP BY 
            `tablekey_id`, 
            `linkdata_id`, 
            `timestamp`, 
            `domain`,
            `is_basedomain`
        

        如果您只想要最新的时间戳,请使用 MAX(timestamp) as timestamp 并将其从 group by 中删除。

        【讨论】:

        • 不会产生正确的结果,因为 searched_domains 仅限于那些 is_basedomain=1 的行。这将产生不正确的结果来计算列。
        • @slaakso 我不明白。我在 sql fiddle sqlfiddle.com/#!2/fdecf/3 中尝试了你和我的查询
        • 好吧,也许我在编辑问题后现在明白了。您和 echo_me 的查询给出了不同的结果。我会检查发生了什么:)
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-07-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-08-01
        • 2022-01-11
        相关资源
        最近更新 更多