#mysql #sql #oracle #postgresql #firebird
#mysql #sql #Oracle #postgresql #firebird
Вопрос:
У меня есть две таблицы, Customers
и Products
. У клиента может быть более одного продукта.
Я пытаюсь получить клиентов, у которых нет определенного продукта.
Например, 10 клиентов купили продукты A
и B
, еще 10 клиентов купили A
, B
, и C
. Как я могу получить тех клиентов, у которых нет C
продукта?
Комментарии:
1. Вам нужно будет предоставить свою структуру таблицы. Мы не экстрасенсы!
2. Предположительно, здесь есть как минимум три таблицы:
customers
(aka клиенты), которые могут покупать вещи,products
которые можно купить, и третья таблица, напримерpurchases
, показывающая, какие клиенты купили какие продукты. Я прав?3. Идентификатор клиента имя адрес телефона Идентификатор продукта имя цена customer_id
4. @user1010861 Что вам действительно нужно сделать, так это обновить свой вопрос в соответствии со структурой БД…
5. И добавьте тег «Домашнее задание» (если это домашнее задание). Я предполагаю, что вам тоже не нужен ответ во всех этих СУБД.
Ответ №1:
Для вашей текущей структуры БД это то, что вы ищете:
select c.id, c.name, c.phone, c.address
from Customers c
where not exists (select * from products p
where p.customer_id = c.id and p.id = 'c')
Однако вам следует рассмотреть возможность создания третьей таблицы для хранения отдельных покупок.
Ответ №2:
select *
FROM customer c
WHERE NOT EXISTS (SELECT 1 from products p
WHERE p.customer_id = c.id)
Вам действительно следует (как уже предлагали @Tony andrews и @Adrian) иметь третью таблицу для хранения сведений о том, какие клиенты купили какой продукт.
Что-то вроде:
**Customer**
Id
Name
Address
Phone
**Product**
Id
Name
Price
**Customer_Product**
customer_id
product_id
Это означает, что вы удаляете избыточность из своей таблицы продуктов. Подумайте, что вам нужно было бы сделать, если бы название продукта немного изменилось — вместо обновления нескольких строк (как вам пришлось бы делать сейчас), вам нужно было бы обновить только 1 строку, и вам вообще не нужно было бы трогать историю транзакций..
Комментарии:
1. привет, ребята, вот как это выглядит: у меня есть 3 таблицы в виде следующих клиентов, продуктов, покупок и, скажем так, у меня есть 3 10 продуктов, я хочу извлечь все записи из базы данных, где у клиентов нет определенного продукта, например
select c.name, c.status, c.contact_number from purchases p join clients c on p.cid = c.id where not exists (product_a)
, спасибо