SQL Fiddle
Предполагая следующие таблицы:
customers
+----+------------------------+------------+------------+
| id | company | first_name | last_name |
+----+------------------------+------------+------------+
| 1 | MDD | T | H |
| 2 | Aliance Magnet A LLP | A | Wilkinson |
| 3 | MAF | C | G |
| 4 | QL | F | B |
| 5 | ARL | S | P |
| 6 | Q Corp. | H | H |
| 7 | VQDA | L | W |
| 8 | AESC | E | W |
| 9 | Placement Incorporated | C | Mendez |
| 10 | Numpties United | Y | Cunningham |
+----+------------------------+------------+------------+
transactions
+----+-----------+-------------+------+
| id | form_type | customer_id | due |
+----+-----------+-------------+------+
| 1 | invoice | 9 | 1 |
| 2 | payment | 1 | 6 |
| 3 | invoice | 7 | 9 |
| 4 | payment | 9 | 4 |
| 5 | invoice | 7 | 5 |
| 6 | payment | 3 | 5 |
| 7 | invoice | 9 | 5 |
| 8 | invoice | 9 | 10 |
| 9 | invoice | 10 | 1 |
| 10 | invoice | 2 | 4 |
+----+-----------+-------------+------+
Следующий запрос находит клиентов с транзакциями счета-фактуры> 0, но возвращает только записи, относящиеся к первым трем клиентам.
SELECT
t.id AS trans_id,
c.id AS customer_id,
c.company,
c.first_name,
c.last_name,
t.due
FROM (
SELECT DISTINCT c.*
FROM customers AS c
INNER JOIN transactions AS t ON t.customer_id = c.id
WHERE t.due > 0
AND t.form_type = 'invoice'
ORDER BY c.company, c.first_name, c.last_name
LIMIT 3
) AS c
INNER JOIN transactions AS t ON t.customer_id = c.id
WHERE t.due > 0
AND t.form_type = 'invoice'
ORDER BY c.company, c.first_name, c.last_name;
results
+----------+-------------+------------------------+------------+------------+------+
| trans_id | customer_id | company | first_name | last_name | due |
+----------+-------------+------------------------+------------+------------+------+
| 10 | 2 | Aliance Magnet A LLP | A | Wilkinson | 4 |
| 9 | 10 | Numpties United | Y | Cunningham | 1 |
| 1 | 9 | Placement Incorporated | C | Mendez | 1 |
| 7 | 9 | Placement Incorporated | C | Mendez | 5 |
| 8 | 9 | Placement Incorporated | C | Mendez | 10 |
+----------+-------------+------------------------+------------+------------+------+
Есть ли способ, например использование оконных функций или общих табличных выражений, которые позволят избежать дублирования WHERE t.due > 0 AND t.form_type = 'invoice'
и предложения ORDER BY
во внутренних и внешних запросах? Или каким-то другим способом получить те же результаты с помощью одного SQL-запроса?