Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Web программирование > SQL, базы данных
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 26.06.2012, 22:36   #1
Pamparam
Форумчанин
 
Регистрация: 08.11.2009
Сообщений: 225
По умолчанию Поиск точного количества строк

Есть Таблица
Нужно выбрать такое tradeid, который будет содержать ровно столько строк, сколько мы будем искать
Например, данные в БД такие:

id tradeid itemid code1
1 1 6 0
2 1 0 041
3 1 0 001

Я ищу 3 строки:
первая: либо tradeid = 6, либо code = 011, либо code = 001
первая: либо tradeid = 8, либо code = 041, либо code = 001
первая: либо tradeid = 8, либо code = 041, либо code = 001
Как видно, может найти вообще одну строку с id=3 (1,0,001), которая будет повторяться три раза в этом tradeid. Пробую добавлять в условие Having найденных айдишников и уникальных:

Код:
SELECT itemid,code1,id,tradeid,count(id) as co FROM tradeitems WHERE 
(itemid IN(6) OR code1 IN(011) OR code1 IN(001) ) AND 
(itemid IN(8) OR code1 IN(041) OR code1 IN(001) ) AND 
(itemid IN(8) OR code1 IN(041) OR code1 IN(001) ) 
GROUP BY tradeid  HAVING  count(tradeid) = 3 AND count(distinct id)=3
ничего не находит. Когда пробую без Having - находит tradeid=1, но только с одной строкой id=3, т.е. той, которая была найдена по code=001 во всех трех условиях.
А мне же нужно искать совпадение по приоритету, т.е. из:
либо tradeid = 6, либо code = 011, либо code = 001
->
если tradeid = 6 не найдено, то искать code = 011, если и его не нашло, то искать строку с code=001
и если совпадение найдено, то сразу отбросить эту строку с дальнейшего поиска
В поиске вроде же по порядку (приоритету) параметры стоят, так почему же находит строку по последнему из них? (пробовал менять местами INы - то же самое).

Последний раз редактировалось Pamparam; 27.06.2012 в 11:45.
Pamparam вне форума Ответить с цитированием
Старый 26.06.2012, 22:50   #2
Pamparam
Форумчанин
 
Регистрация: 08.11.2009
Сообщений: 225
По умолчанию

сообразил уже (вспомнил), после написанного, что code - поле спецом сделанное для поиска и можно добавить в начало 0 и 1. 0 - для поиска по itemid, 1 - для поиска по другому полю, т.е. программно делать код для каждой строки, записывать его в поле и по нему же искать
Но вопрос, для общего развития, открыт

не получилось)

Последний раз редактировалось Pamparam; 27.06.2012 в 11:21.
Pamparam вне форума Ответить с цитированием
Старый 27.06.2012, 01:14   #3
Joeymax
Пользователь
 
Регистрация: 17.01.2012
Сообщений: 14
По умолчанию

Код:
GROUP BY tradeid  HAVING  count(tradeid) = 3 AND count(distinct id)=3
Для решения поставленной задачи, это условие совершенно излишне
Joeymax вне форума Ответить с цитированием
Старый 27.06.2012, 01:19   #4
Pamparam
Форумчанин
 
Регистрация: 08.11.2009
Сообщений: 225
По умолчанию

Цитата:
Сообщение от Joeymax Посмотреть сообщение
Код:
GROUP BY tradeid  HAVING  count(tradeid) = 3 AND count(distinct id)=3
Для решения поставленной задачи, это условие совершенно излишне
мне нужно найти точное кол-во строк, которое равно кол-ву строк в tradeid. Почему же вдруг оно "совершенно излишне"?
Pamparam вне форума Ответить с цитированием
Старый 27.06.2012, 01:57   #5
Joeymax
Пользователь
 
Регистрация: 17.01.2012
Сообщений: 14
Хорошо

На приведенных данных, только одна строка удовлетворяет условию where, даже отбрасывая count(id). Вот такое решение устроит?
Код:
create table tradeitems (
	id		int auto_increment primary key,
	tradeid	int,
	itemid 	int,
	code		char(3)
);

insert into tradeitems(tradeid, itemid, code) value
(1, 6, "0"),
(1, 0, "021"),
(1, 0, "021"),
(1, 0, "031"),
(1, 0, "051"),
(1, 0, "041"),
(1, 0, "001");

SELECT a.itemid, a.code, a.id, a.tradeid, b.cnt FROM
	tradeitems a,
	(SELECT count(id) as cnt 
		FROM tradeitems WHERE itemid IN (6, 8) OR code in ("041", "001")) b
	WHERE a.itemid in (6, 8) OR a.code IN ("041", "001");

Последний раз редактировалось Joeymax; 27.06.2012 в 03:57.
Joeymax вне форума Ответить с цитированием
Старый 27.06.2012, 11:41   #6
Pamparam
Форумчанин
 
Регистрация: 08.11.2009
Сообщений: 225
По умолчанию

Во-первых, в вашем примере мне найдет количество всех строк, входящих в таблицу, а не в tradeid. Что мне с ним делать?
Во-вторых, мне нужно найти tradeid, в котором будет содержаться точно столько строк, сколько я их буду искать.

Для поиска tradeid, содержащего 3 строки:
первая: 16 or 0011 or 0001
вторая: 18 or 0041 or 0001
третья: 18 or 0041 or 0001
переделал старый пример от Аватара и pproger (спс еще раз).
Код:
SELECT U.tradeid, U.id, U.dis 
FROM ( SELECT tradeid, id, count(distinct id) as dis, 
SUM(CASE WHEN code1=16 or code1=0011 or code1=0001 THEN 1 ELSE 0 END) AS Count0, 
SUM(CASE WHEN code1=18 or code1=0041 or code1=0001 THEN 1 ELSE 0 END) AS Count1, 
SUM(CASE WHEN code1=18 or code1=0041 or code1=0001 THEN 1 ELSE 0 END) AS Count2 
FROM tradeitems WHERE code1 IN (16,18,'0041','0011','0001') GROUP BY tradeid) U 
WHERE (Count0>0) AND (Count1>0) AND (Count2>0) and dis=3 and 
(SELECT COUNT(*) FROM tradeitems T2 WHERE T2.tradeid=U.tradeid) =3;
Т.е. проверяю, что каждая строка точно найдена и всего найдено уникальных 3 строки из трех существующих

Последний раз редактировалось Stilet; 27.06.2012 в 21:32.
Pamparam вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вывод количества строк в БД Smile08 C# (си шарп) 2 04.08.2011 13:29
Подсчет количества строк в БД (Delphi 7) NuR1k БД в Delphi 8 30.08.2010 03:57
ошибка подсчета количества строк kinnder Помощь студентам 4 02.03.2010 23:38
Поиск точного значения с помощью функции БИЗВЛЕЧЬ THE_ENGINEER Microsoft Office Excel 8 23.07.2008 11:37