Справка по сложным SQL-запросам

0

Учитывая довольно стандартный набор связанных таблиц, таких как Customers, Invoices и Line Items. Мне нужно сделать такой запрос, как "Выбрать всех клиентов, у которых есть счета-фактуры, в которых есть 5 позиций или больше" или "Выбрать всех клиентов, которые имеют более двух счетов-фактур" или, наконец, "Выбрать всех клиентов, у которых есть позиции на сумму более 100 долларов"

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

Теги:
cakephp

4 ответа

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

Фильтрация клиентов с помощью двух или более счетов-фактур сложнее, так как мы присоединяемся к таблице lineitems. На счет-фактуру может быть несколько строк. Поэтому, чтобы подсчитывать только уникальные счета-фактуры, мы должны добавить distinct к счету, например:

having count(distinct i.id) >= 2

Чтобы отфильтровать клиентов с более чем 100 $в элементах, добавьте:

having sum(li.cost) > 100

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

having sum(li.itemcount * li.itemcost) > 100
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 изменится в зависимости от того, что вы хотите вернуть.

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

0

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

   SELECT customer_id, COUNT(*) AS num_invoices
     FROM invoices
 GROUP BY customer_id 
   HAVING COUNT(*) > 2
0

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню