#mysql #sql-server
#mysql #sql-сервер
Вопрос:
Я изучаю sql и столкнулся с проблемой. У меня есть три таблицы
table Product(
model varchar(50),
maker varchar(50),
type varchar(50),
CONSTRAINT product_pk PRIMARY KEY (model)
);
table PC (
serial_number varchar(50),
model varchar(50),
price number,
speed number,
ram number,
hd varchar(50),
cd varchar(50),
CONSTRAINT pc_pk PRIMARY KEY (serial_number),CONSTRAINT pc_2_product_fkFOREIGN KEY (model) REFERENCES Product(model)
);
Laptop (
serial_number varchar(50),
model varchar(50),
price number,
speed number,
ram integer,
hdvarchar(50),
screen varchar(50),
CONSTRAINT laptop_pk PRIMARY KEY (serial_number),CONSTRAINT laptop_2_product_fk FOREIGN KEY (model) REFERENCES Product(model)
);
И мне нужно найти самый дешевый ПК или ноутбук с учетом скорости, оперативной памяти, HD. Если у вас есть какие-либо советы, я буду признателен. Спасибо
Комментарии:
1. Пожалуйста, объясните правила, которые вам необходимо соблюдать, чтобы считать, что компьютер или ноутбук дешевле другого, и покажите, что вы уже сделали
Ответ №1:
Прямой вариант — ранжировать каждую категорию и фильтровать ее. 1. Сначала объедините все таблицы для ПК и ноутбуков. 2. Присвоите ранг / dense_rank данным в порядке возрастания цены и уменьшения объема оперативной памяти. 3. Если вы отсортируете rank, вы получите самую дешевую машину с самой высокой конфигурацией по порядку.
примечание: Мы обычно выбираем процессор ram n перед покупкой ноутбука / ПК, поэтому в реальном сценарии решите, что вы хотите применить, чтобы фильтровать и ранжировать остальную информацию. Вы также можете фильтровать ценовой диапазон и сортировать остальную информацию.
Ответ №2:
Используйте предложение WHERE, чтобы ограничить результаты теми, которые соответствуют требованиям. Затем СДЕЛАЙТЕ ЗАКАЗ, чтобы сначала получить самый дешевый. Я не уверен, каковы ваши значения hd. Я предполагаю, что они имеют какой-то размер и их можно сравнить с одним значением.
SELECT TOP 1 *
FROM PC
WHERE speed >= @speed_min AND ram >= @ram_min AND hd >= @hd_min
ORDER BY price ASC
Если вам нужен самый дешевый ноутбук, сделайте то же самое для ноутбука. Если вам нужны оба, используйте ОБЪЕДИНЕНИЕ ALL между двумя запросами.
Ответ №3:
Спасибо всем, кто не торопился отвечать, и я делюсь тем, как я на это ответил.
WITH rank AS(
SELECT row_number() OVER (
PARTITION BY ram,speed,hd
ORDER BY price) position, maker,serial_number,speed,ram,hd,price,type
FROM (SELECT serial_number,speed,ram,hd,price,p.type,p.maker FROM product p JOIN laptop l ON p.model = l.model
UNION ALL SELECT serial_number,speed,ram,hd,price,p.type,p.maker FROM product p JOIN pc ON p.model = pc.model)
ORDER BY price
)
SELECT maker,serial_number,speed,ram,hd,price,type FROM rank WHERE price = (SELECT MIN(price) FROM rank);