MySQL-仅当左表中存在一行时才连接

MySQL-仅当左表中存在一行时才连接,mysql,select,join,group-by,Mysql,Select,Join,Group By,以下是MySQL: SELECT a.id, a.name, a.n, a.r, a.pot, a.ticket_price, a.starting_tickets, a.started, a.end, COUNT(b.id) tickets_bought FROM current_lotteries a JOIN lottery_ticket

以下是MySQL:

SELECT  a.id,
        a.name,
        a.n,
        a.r,
        a.pot,
        a.ticket_price,
        a.starting_tickets,
        a.started,
        a.end,
        COUNT(b.id) tickets_bought 
FROM current_lotteries a
   JOIN lottery_tickets b ON b.lid=a.id
WHERE a.cid=1 
ORDER BY started DESC LIMIT 1    

在搜索中,如果
a
中没有行,但是
b
中有行(即
COUNT(b.id)
不是
NULL
),则此查询返回一行
a
字段的
NULL
值以及
COUNT(b.id)
作为
tickets\u购买的任何值。如果表
a
中没有结果,如何修改此查询以使其不返回行(
num_rows=0

啪的一声


缺少
GROUPBY
子句,MySQL(在其他RDBMS中可能出现错误的情况下允许这样做)将聚合组应用于
b
中的所有行,而它应该对这些行进行分组。添加
按a.id分组

SELECT  a.id,
        a.name,
        a.n,
        a.r,
        a.pot,
        a.ticket_price,
        a.starting_tickets,
        a.started,
        a.end,
        COUNT(b.id) tickets_bought 
FROM current_lotteries a
   JOIN lottery_tickets b ON b.lid=a.id
WHERE a.cid=1 
GROUP BY a.id
ORDER BY started DESC LIMIT 1    
以上内容将在MySQL中起作用,但在其他地方不起作用。更可移植的版本使用相关子查询:

SELECT  a.id,
        a.name,
        a.n,
        a.r,
        a.pot,
        a.ticket_price,
        a.starting_tickets,
        a.started,
        a.end,
        b.tickets_bought
FROM current_lotteries a
        /* More portable to join against a subquery which returns the count per group */
        JOIN (
            SELECT b.lid, COUNT(*) AS tickets_bought 
            FROM lottery_tickets 
            GROUP BY lid
        ) b ON a.id = b.lid
WHERE a.cid = 1
ORDER BY started DESC LIMIT 1
试试这个:

SELECT a.id, a.name, a.n, a.r, a.pot, a.ticket_price, 
       a.starting_tickets, a.started, a.end, b.tickets_bought 
FROM current_lotteries a 
RIGHT JOIN (SELECT b.lid, COUNT(*) AS tickets_bought 
            FROM lottery_tickets GROUP BY lid ) b ON a.id = b.lid 
WHERE a.cid = 1 
ORDER BY started DESC 
LIMIT 1;

不,
tickets\u bunded
是一个别名。“此查询返回一行
a
字段的空值”,我不同意,除非
a
本身可以包含空值。这确实是您使用的查询吗?您描述的行为不是
内部联接的行为,而是
右联接的行为。我检查了表结构,在
NULL
下,每一列都有
no
。但是当我运行上面的查询时,它会为每个字段返回
NULL
。等等,我想我看到了-没有分组依据,MySQL通常会将自己与聚合混淆。我按
b.lid
分组,它似乎可以工作,有什么区别吗?@keirsimons在那个版本中,没有区别,因为它是一个内部连接。不过,我发布的第二个查询更合适,因为它不依赖于奇怪的MySQL行为。@KeirSimons:如果没有
GROUP BY
,它将统计查询返回的所有行。但从查询中可以明显看出,您希望每个
a.id
进行计数。这就是为什么您需要根据该标准指定分组,这会影响
COUNT()
的结果。