6

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    

検索で、 from の行がなくa、 in の行があるb(つまり、 COUNT(b.id)is ではない) 場合、このクエリはフィールドの値とasの値をNULL含む行を返します。table に結果がない場合に行 () を返さないように、このクエリを変更するにはどうすればよいですか?NULLaCOUNT(b.id)tickets_boughtnum_rows = 0a

スナップ。

クエリ

4

2 に答える 2

9

句がない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    

上記は 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
于 2013-01-06T13:44:13.503 に答える
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;
于 2013-01-06T13:55:34.890 に答える