Учитывая довольно стандартный набор связанных таблиц, таких как Customers, Invoices и Line Items. Мне нужно сделать такой запрос, как "Выбрать всех клиентов, у которых есть счета-фактуры, в которых есть 5 позиций или больше" или "Выбрать всех клиентов, которые имеют более двух счетов-фактур" или, наконец, "Выбрать всех клиентов, у которых есть позиции на сумму более 100 долларов"
Я делаю это сейчас довольно сложно (прохожу через все записи вручную), и я знаю, что это самый неэффективный способ, но я не знаю достаточного количества SQL для создания этих запросов. Я использую PHP5, MySQL и CakePHP 1.25.
Начните, соединяя их все вместе:
select c.id
from customers c
left join invoices i on i.customer_id = c.id
left join lineitems li on li.invoice_id = i.id
group by c.id
Чтобы фильтровать клиентов с более чем 5 позициями или более, добавьте:
having count(li.id) >= 5
Фильтрация клиентов с помощью двух или более счетов-фактур сложнее, так как мы присоединяемся к таблице lineitems. На счет-фактуру может быть несколько строк. Поэтому, чтобы подсчитывать только уникальные счета-фактуры, мы должны добавить distinct
к счету, например:
having count(distinct i.id) >= 2
Чтобы отфильтровать клиентов с более чем 100 $в элементах, добавьте:
having sum(li.cost) > 100
Вы можете использовать математику внутри sum
, если вы сохраняете отдельные позиции и цены:
having sum(li.itemcount * li.itemcost) > 100
Скажите, что у вас было:
customers.id
line_items.user_id
line_items.numItems
Запрос будет выглядеть так:
SELECT * FROM customers
JOIN line_items
ON line_items.user_id WHERE line_items.numItems > 5
Ваше предложение WHERE
изменится в зависимости от того, что вы хотите вернуть.
Не работал с SQL Joins в то время, но я думаю, что это что-то вроде этого.
Ниже приведена некоторая помощь со вторым, который должен вас поймать:
SELECT customer_id, COUNT(*) AS num_invoices
FROM invoices
GROUP BY customer_id
HAVING COUNT(*) > 2
Для первых двух вы можете использовать GROUP BY
и HAVING COUNT(*)>4
, а для последнего вы можете использовать SUM(field)
.
Если вы хотите SQL, то, пожалуйста, покажите свою попытку.