子のレコードが1である1対多の関係の子を選択しようとします。1つのレコードを持つ子をフェッチするには、次のクエリを使用します。
これは、where
ステートメントを使用しない場合に機能する簡単なクエリです。
select a.iid,
account_id,
count(*) as props
from accounts_prop a
group by a.account_id
having props = 1
使用するwhere
と、まったく別の結果が返されます。この場合、小道具には1つのレコードがありますが、実際には複数のレコードがあることを示すレコードを取得します。
select a.iid,
account_id,
count(*) as props
from accounts_prop a
where a.von >= '2017-08-25'
group by a.account_id
having props = 1
この場合私が欠けているもの
よく調べてみると、元のクエリは確定していません。
SELECT
a.iid, -- OK, but which value of iid do we choose?
a.account_id,
COUNT(*) AS props
FROM accounts_prop a
GROUP BY a.account_id
HAVING props = 1
iid
他の列に集約しながら列を選択しているため、クエリは意味がありません。アカウントごとにどの値をiid
選択する必要がありますか?これは明確ではなく、クエリは特定のバージョンのMySQLや他のほとんどのデータベースでも実行されません。
代わりに、サブクエリにレコードが1つしかないアカウントを検索するロジックを配置し、そのサブクエリに参加して、一致するたびに完全なレコードを取得します。
SELECT a1.*
FROM accounts_prop a1
INNER JOIN
(
SELECT account_id
FROM accounts_prop
GROUP BY account_id
HAVING COUNT(*) = 1
) a2
ON a1.account_id = a2.account_id
WHERE a1.von >= '2017-08-25'
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加