2009-12-05 4 views
0

Учитывая довольно стандартный набор связанных таблиц, таких как клиенты, счета-фактуры и позиции. Мне нужно сделать запрос типа «Выбрать всех клиентов, у которых есть счета-фактуры, в которых есть 5 позиций или больше» или «Выбрать всех клиентов, у которых более двух счетов-фактур» или «Выбрать всех клиентов, у которых есть позиции на сумму более 100 долларов»Сложная справка по SQL-запросам

Я делаю это с трудом (просматривая все записи вручную), и я знаю, что это самый неэффективный способ, но я не знаю достаточного количества SQL для построения этих запросов. Я использую PHP5, MySQL и CakePHP 1.25.

ответ

0

Начало, соединяя их все вместе:

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 

Фильтрация клиентов двумя или более фактурами сложнее, поскольку мы присоединяемся к таблица строк. На счет-фактуру может быть несколько строк. Таким образом, чтобы рассчитывать только уникальные счета, мы должны добавить distinct к графу, как:

having count(distinct i.id) >= 2 

Для фильтрации клиентов с более чем $ 100 в графах, добавьте:

having sum(li.cost) > 100 

Вы можете использовать математику внутри sum, если вы сохраняете отдельные позиции и цены:

having sum(li.itemcount * li.itemcost) > 100 
0

Для первых двух вы можете использовать GROUP BY и HAVING COUNT(*)>4, а для последнего вы можете использовать SUM(field).

Если вы хотите SQL, то, пожалуйста, покажите свою попытку.

0

Допустим, у вас:

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 будет меняться в зависимости O что вы хотели вернуться.

Не работал с SQL Joins, но я думаю, что это что-то в этом роде.

0

Вот некоторая помощь со вторым, который должен заставить вас идти:

SELECT customer_id, COUNT(*) AS num_invoices 
    FROM invoices 
GROUP BY customer_id 
    HAVING COUNT(*) > 2 
Смежные вопросы