Допустим, у меня есть две таблицы с именами customers
и transactions
, пример данных выглядит следующим образом:
клиенты
+----+---------------------------------+------------+------------+
| id | company | first_name | last_name |
+----+---------------------------------+------------+------------+
| 1 | Mus Donec Dignissim LLC | Tad | Hoffman |
| 2 | Aliquet Magna A LLP | Aretha | Wilkinson |
| 3 | Mauris Aliquam Foundation | Cooper | Goff |
| 4 | Quisque Libero Lacus Associates | Fulton | Beard |
| 5 | At Risus Ltd | Simone | Perkins |
| 6 | Quam Corp. | Hayfa | Hernandez |
| 7 | Vel Quam Dignissim Associates | Linus | Walker |
| 8 | A Enim Suspendisse Consulting | Emi | Wallace |
| 9 | Placerat Industries | Cody | Mendez |
| 10 | Nunc Limited | Yasir | Cunningham |
+----+---------------------------------+------------+------------+
Сделка
+----+-----------+-------------+------+
| id | form_type | customer_id | due |
+----+-----------+-------------+------+
| 1 | invoice | 9 | 1.08 |
| 2 | payment | 1 | 6.32 |
| 3 | invoice | 7 | 9.42 |
| 4 | payment | 9 | 3.58 |
| 5 | invoice | 7 | 5.35 |
| 6 | payment | 3 | 5.42 |
| 7 | invoice | 9 | 5.32 |
| 8 | invoice | 9 | 9.62 |
| 9 | invoice | 10 | 1.40 |
| 10 | invoice | 2 | 3.72 |
+----+-----------+-------------+------+
Я хочу выбрать все транзакции на основе некоторого условия (см. SQL ниже) для 3 клиентов, отсортированных в алфавитном порядке их company
, first_name
и last_name
соответственно.
Таким образом, идея заключается в том, что при выводе может быть возвращено более 3 строк, поскольку один конкретный клиент может иметь более одной совпадающей транзакции, но всего должно быть только 3 клиента.
Я знаю, что приведенный ниже SQL явно неправильно ограничивает количество строк, а не отдельных клиентов для требуемых данных, но здесь необходимо прояснить вопрос:
SELECT
t.id AS trans_id,
c.id AS customer_id,
c.company,
c.first_name,
c.last_name,
t.due
FROM `customers` AS c, `transactions` AS t
WHERE t.due > 0 AND t.form_type = 'invoice' AND c.id = t.customer_id
ORDER BY c.company, c.first_name, c.last_name
LIMIT 0, 3
Я пробовал способы использования INNER JOIN
или подзапроса, но либо они возвращают неверные данные, либо SQL кажется мне не совсем правильным. Я ищу какое-то экспертное решение по этому вопросу.
SQLFiddle
UPDATE
Я забыл упомянуть, что не могу использовать IN
для результата подзапроса, так как версия MySQL это отрицает.
Эта версия MySQL еще не поддерживает подзапрос LIMIT & IN / ALL / ANY / SOME.
Пожалуйста, предоставьте альтернативу.