Справка по сложным SQL-запросам - PullRequest
0 голосов
/ 05 декабря 2009

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

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

Ответы [ 4 ]

0 голосов
/ 05 декабря 2009

Начните с объединения их всех вместе:

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 голосов
/ 05 декабря 2009

Скажем, у вас было:

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-соединениями , но я думаю, что-то вроде этого.

0 голосов
/ 05 декабря 2009

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

   SELECT customer_id, COUNT(*) AS num_invoices
     FROM invoices
 GROUP BY customer_id 
   HAVING COUNT(*) > 2
0 голосов
/ 05 декабря 2009

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...