【问题标题】:Select results from table1 based on entries on table2根据 table2 上的条目从 table1 中选择结果
【发布时间】:2016-07-18 07:58:05
【问题描述】:

我有 2 张桌子;

banner_views (id, b_id, b_date)- 每次显示时都会记录一个横幅视图

banners_dynamic (id, status, static_iname, static_keywords, static_url, static_alt, static_type, static_image, b_views, b_clicks) - 存储横幅数据

我想选择过去 7 天观看次数最少的 3 个banners_dynamic 结果。

我确实将一些东西放在一起(见下文),但我意识到它是在获取所有横幅的总视图,而不是按 id 唯一。

SELECT  *, 
(SELECT COUNT(*) FROM banner_views v WHERE v.b_date >= DATE(NOW()) - INTERVAL 7 DAY) as post_count 
FROM banners_dynamic b  
WHERE static_keywords LIKE '%test%' AND b.status='1' AND b.static_type='1' 
ORDER BY post_count ASC LIMIT 3

谁能指出我正确的方向?

【问题讨论】:

  • banner_views中的b_id是banners_dynamic上的id吗?我看不出它们有什么关系。

标签: php sql date


【解决方案1】:

您必须将 banners_dynamic 表和您的子查询与相应的横幅 ID 连接起来:

SELECT
    b.*, p.b_count
FROM
    banners_dynamic b
    INNER JOIN (
        SELECT
            b_id,
            COUNT(*) AS b_count
        FROM
            banner_views v
        WHERE
            v.b_date >= DATE(NOW() - INTERVAL 7 DAY)
        GROUP BY
            b_id
    ) p on p.b_id = b.id
WHERE
    b.static_keywords LIKE '%test%'
    AND b.`status` = '1'
    AND b.static_type = '1'
ORDER BY
    p.b_count ASC
LIMIT 3

更新:即使没有子查询也可以做到:

SELECT
    b.*, COUNT(v.b_id) AS b_count
FROM
    banners_dynamic b
    INNER JOIN banner_views v ON v.b_id = b.id
WHERE
    v.b_date >= DATE_ADD(NOW(), INTERVAL - 7 DAY)
    AND b.static_keywords LIKE '%test%'
    AND b.`status` = '1'
    AND b.static_type = '1'
GROUP BY
    v.b_id
ORDER BY
    b_count ASC
LIMIT 3;

如果您想包含没有任何浏览量的横幅 (count=0),那么您必须执行 LEFT JOIN:

SELECT
    b.*, COUNT(v.b_id) AS b_count
FROM
    banners_dynamic b
    LEFT JOIN banner_views v ON v.b_id = b.id
              AND v.b_date >= DATE_ADD(NOW(), INTERVAL - 7 DAY)
WHERE
    b.static_keywords LIKE '%test%'
    AND b.`status` = '1'
    AND b.static_type = '1'
GROUP BY
    v.b_id
ORDER BY
    b_count ASC
LIMIT 3;

【讨论】:

  • 感谢 mitkosoft - 完美运行,下次很容易理解(我使用了第三个选项,因为添加新横幅时我会得到 0)。
  • 太棒了!在这种情况下标记答案以结束主题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-19
  • 1970-01-01
  • 1970-01-01
  • 2022-01-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多