MySQL - 仅当左表中存在行时才加入

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),那么该查询返回的行NULLa字段和的任何值COUNT(b.id)作为tickets_bought.如何修改此查询,以便num_rows = 0在表中没有结果时不返回row()a

一个快照.

询问

Mic*_*ski 8

如果没有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)