MySQL-仅当左表中存在一行时才连接
以下是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
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()
的结果。