Kei*_*ons 5 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_tickets b ON b.lid=a.id
WHERE a.cid=1
ORDER BY started DESC LIMIT 1
Run Code Online (Sandbox Code Playgroud)
在搜索中,如果没有从行a,但也有行b(即COUNT(b.id)不是NULL),那么该查询返回的行NULL值a字段和的任何值COUNT(b.id)作为tickets_bought.如何修改此查询,以便num_rows = 0在表中没有结果时不返回row()a?
一个快照.

如果没有GROUP BY子句,MySQL(允许在其他RDBMS中出错的情况下)将聚合组应用于b应该对它们进行分组的所有行.加GROUP BY 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
Run Code Online (Sandbox Code Playgroud)
以上内容适用于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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
19888 次 |
| 最近记录: |