【问题标题】:SQL - Where clause and distinctSQL - Where 子句和 distinct
【发布时间】:2015-09-30 21:05:09
【问题描述】:

我正在尝试使用 PDO 执行 SQL 查询,它将从两个不同的表中选择数据,并将它们匹配在一起:

$stmt = $dbh->prepare("
    select a.token, b.token, b.username, COUNT(DISTINCT a.token) adcount, COUNT(DISTINCT b.username WHERE a.token=b.token) clickcount
    from advertisements a, advertisement_clicks b
    where a.status='2' AND (a.clicks_left > 0 OR a.fixed ='1')
    AND b.token=a.token
    ");
    $stmt->bindParam(':userid', $userdata["id"]); 
    $stmt->execute();
    $s1=$stmt->fetch();

所以,上面的 SQL 不起作用。我正在尝试选择 amount 的记录,其中 a.tokenb.token 匹配为 clickcount

我怎样才能做到这一点?

【问题讨论】:

    标签: php mysql sql pdo


    【解决方案1】:
    select 
    a.token, b.token, b.username, COUNT(DISTINCT a.token) adcount, 
    COUNT(DISTINCT b.username) clickcount
    from advertisements a 
    JOIN advertisement_clicks b ON b.token=a.token
    where a.status='2' AND (a.clicks_left > 0 OR a.fixed ='1')
    

    您已经在join处理表格。您无需在count 中使用where 子句。

    【讨论】:

    • 可能需要group by
    • group by 是做什么的?
    • 因为您使用的是聚合函数count,所以您需要在所有其他列上包含group by。然而,MySQL 对此并不严格。
    • 添加分组依据后,我得到的所有结果都是“1”。如果我删除它,我会得到 12,这是正确的数量。
    【解决方案2】:

    这是一个查询,它选择a.tokenb.token 匹配为clickcount 的记录数量:

    SELECT a.token, b.token, COUNT(a.token) clickcount
        FROM advertisements a
        JOIN advertisement_clicks b
        ON b.token=a.token
        WHERE a.status='2' AND (a.clicks_left > 0 OR a.fixed ='1')
        GROUP BY a.token;
    

    【讨论】:

    • 尽量避免隐式连接(在 from 子句中有两个表)是一种不推荐使用的语法,建议切换到现代的显式 JOIN 语法:
    • 是的。您仍然对...的组有一些问题。需要同时包含group by a.token, b.token
    猜你喜欢
    • 2021-11-17
    • 1970-01-01
    • 2011-08-02
    • 1970-01-01
    • 1970-01-01
    • 2023-01-27
    • 2014-03-12
    • 1970-01-01
    相关资源
    最近更新 更多