2013-05-05 3 views
1

Мне нужно получить все имя клиента, где их предпочтения MINPRICE и MAXPRICE совпадают.Получить результаты, которые имеют одинаковые данные в таблице

Вот моя схема:

CREATE TABLE CUSTOMER (
PHONE VARCHAR(25) NOT NULL, 
NAME VARCHAR(25), 
CONSTRAINT CUSTOMER_PKEY PRIMARY KEY (PHONE), 
); 

CREATE TABLE PREFERENCE (
PHONE VARCHAR(25) NOT NULL, 
ITEM  VARCHAR(25)  NOT NULL, 
MAXPRICE NUMBER(8,2), 
MINPRICE NUMBER(8,2), 
CONSTRAINT PREFERENCE_PKEY PRIMARY KEY (PHONE, ITEM), 
CONSTRAINT PREFERENCE_FKEY FOREIGN KEY (PHONE) REFERENCES CUSTOMER (PHONE) 
); 

Я думаю, что мне нужно сделать некоторые сравнения между рядами? или создать другие взгляды для сравнения? любой простой способ сделать это?

его один для многих. клиент может иметь несколько предпочтений, поэтому мне нужно запросить список клиентов, у которых есть тот же самый предел и прейскурант. сравнить между рядами minprice = minprice и maxprice = maxprice

+2

(Телефонный номер не является хорошей идеей для первичного ключа/идентификатора клиента. Люди меняют свои номера телефонов.) – Mat

ответ

0

Самосоединение на preference бы найти строки с одинаковыми предпочтениями в цене, но другой номер телефона:

select distinct c1.name 
,  p1.minprice 
,  p1.maxprice 
from preference p1 
join preference p2 
on  p1.phone <> p2.phone 
     and p1.minprice = p2.minprice 
     and p1.maxprice = p2.maxprice 
join customer c1 
on  c1.phone = p1.phone 
join customer c2 
on  c2.phone = p2.phone 
order by 
     p1.minprice 
,  p1.maxprice 
,  c1.name 
+0

любые более динамичные способы сделать это? что, если у меня есть 3 имени, которые имеют одинаковое значение, 10 имя, которое имеет одинаковые значения, я не хочу, чтобы они соединялись два раза между 3 именами. Мне нужен список отдельных имен, которые имеют те же значения – user2351750

+0

Изменен запрос, чтобы получить список имен с одинаковыми ценовыми точками. Если вы хотите отформатированный список, посмотрите [group_concat() в Oracle] (http://explainextended.com/2009/04/05/group_concat-in-oracle-10g/). Вероятно, это лучше сделать на стороне клиента. – Andomar

+0

Вы должны использовать '<', а не '<>'. В противном случае вы получите два результата для каждой пары. – Barmar

0

Это кажется странным, что у вас есть minprice и maxprice в таблице предпочтений. Это таблица, которую вы обновляете после каждой транзакции, так что каждый клиент имеет только 1 активную запись предпочтений? Я имею в виду, что он читается, как клиент может заплатить две разные цены за один и тот же предмет, что кажется странным.

Предполагая, что клиент и предпочтения являются 1: 1

SELECT c.* 
FROM customer c INNER JOIN preference p ON c.phone = p.phone 
WHERE p.minprice = p.maxprice 

Однако, если клиент может иметь несколько предпочтений, и вы ищете minprice = maxprice для ВСЕХ п ..., то вы могли бы сделать это

SELECT c.* 
FROM (SELECT phone, MIN(minprice) as allMin, MAX(maxprice) as allMax 
     FROM preference 
     GROUP BY phone) p INNER JOIN customer c on p.phone = c.phone 
WHERE allMin = allMax 
+0

извините его за одного. клиент может иметь несколько предпочтений, поэтому мне нужно запросить список клиентов, у которых есть тот же самый предел и прейскурант.сравнить между строками minprice = minprice и maxprice = maxprice – user2351750

0

Это отобразит все имена клиентов, которые имеют одинаковые ценовые предпочтения.

SELECT minprice, maxprice, GROUP_CONCAT(name) names 
FROM preference 
JOIN customer USING (phone) 
GROUP BY minprice, maxprice 
HAVING COUNT(*) > 1 

Предложение HAVING предотвращает это показывает предпочтения, которые не имеют дубликаты. Если вы хотите увидеть эти предпочтения одного клиента, удалите эту строку.

+0

Если Oracle поддерживает 'group_concat', это будет лучший soluiton :) – Andomar

+0

@Andomar Упс, забыл, что он использует Oracle, а не MySQL. – Barmar

+0

@ Оркестр орфографии поддерживает 'listagg';) –

Смежные вопросы