私はフレームワーク(Magento)を使っているので、実際に実行されるSQLを直接制御することはできません。クエリのさまざまな部分を構築することができますが、異なるコンテキストでは、データベースに行く前にさまざまな方法で変更します。カウントと行の両方に対してmysqlクエリの本体を再利用
ここに私が取り組んでいるものの単純化された例があります。
students enrolments
-------- ------------------
id| name student_id| class
--+----- ----------+-------
1| paul 1|biology
2|james 1|english
3| jo 2| maths
2|english
2| french
3|physics
3| maths
と一緒に、これらの学生は上の登録されているすべてのコースを英語を勉強している学生全員を表示するクエリは、次のようになります。
SELECT name, GROUP_CONCAT(enrolments.class) AS classes
FROM students LEFT JOIN enrolments ON students.id=enrolments.student_id
WHERE students.id IN (SELECT e.student_id
FROM enrolments AS e
WHERE e.class LIKE "english")
GROUP BY students.id
これは期待通りの結果
name| classes
----+----------------------
paul|biology, english
james|maths, english, french
を与えるだろう
英語を勉強する学生の数を数えることは、Magentoが自動的に部分を使用する私の最初の質問の。カウントについては、次のように元のクエリを変更します。
- 選択されている列を削除します。これは
name
とclasses
の列になります。 - 選択するために、
count(*)
列が
この肉屋の後、上記の私のクエリは私に在籍生徒数を与えることはありません
SELECT COUNT(*)
FROM students LEFT JOIN enrolments ON students.id=enrolments.student_id
WHERE students.id IN (SELECT e.student_id
FROM enrolments AS e
WHERE e.class LIKE "english")
なっいかなるgroup by
句を削除し追加します私が必要とする英語コース。代わりに、英語コースに登録しているすべての生徒の合計登録数を教えてくれます。
私は両方のコンテキスト、カウント、および行の取得に使用できるクエリを考え出しています。私はどのような節や節を残すことができます。
残念ながら、前述のとおり、Magentoはカウントクエリを作成する前に列を削除します。つまり、相関サブクエリが削除されます。試してくれてありがとう。 – Dom
Magentoの構造を操作するために、選択された列からサブクエリをジョインにシフトすることでクエリを作成できます。ただし、外部表の各反復でサブクエリが実行されるため、これは実際には遅いです。 – Dom
"残念ながら、私が言及したように、Magentoはカウントクエリを作成する前に列を削除します" - はい。そして、カウントは私のクエリの行数と同じになります。だから問題は何ですか? –