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

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

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

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

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

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

id groupid itemid
1 1 4
2 1 1
3 1 3
4 1 4
5 2 2
6 2 1
7 2 3
8 3 1
9 3 4
10 3 2

Как вытянуть только те groupid, в которых есть только itemid с значениями 1 и 3. Т.е. получить groupid=1,2
Pamparam вне форума Ответить с цитированием
Старый 05.06.2012, 16:06   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Код:
SELECT groupid FROM Table1 WHERE itemid IN (1,3) GROUP BY groupid
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 05.06.2012, 16:14   #3
Pamparam
Форумчанин
 
Регистрация: 08.11.2009
Сообщений: 225
По умолчанию

Получаю строки, где есть или 1 или 3, а нужно чтобы были и 1 и 3
Pamparam вне форума Ответить с цитированием
Старый 05.06.2012, 16:19   #4
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Код:
SELECT T1.groupid FROM Table1 T1
  WHERE T1.itemid=1 AND EXISTS(SELECT * FROM Table1 T2 WHERE T2.groupid=T1.groupid AND T2.itemid=3) 
  GROUP BY T1.groupid
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 05.06.2012, 16:27   #5
Pamparam
Форумчанин
 
Регистрация: 08.11.2009
Сообщений: 225
По умолчанию

благодарствую!

з.ы. с увеличением кол-ва itemid (1,3,...) каждый раз делать вложенный запрос?

Последний раз редактировалось Stilet; 05.06.2012 в 20:30.
Pamparam вне форума Ответить с цитированием
Старый 05.06.2012, 16:46   #6
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

А если их 100 будет? Такой способ не пойдет, скорее всего несколькоо запросов с использованием прмежуточных временных таблиц
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 05.06.2012, 17:42   #7
Pamparam
Форумчанин
 
Регистрация: 08.11.2009
Сообщений: 225
По умолчанию

в моем случае до 5
если я хочу выбрать только те groupid, в которые входят только itemid 1,3,2 (т.е. хочу получить groupid=2) как быть? Можно ли посчитать кол-во строк в вложенном запросе? На Count вложенного запроса ругается...

PHP код:
$q1="Count(SELECT id FROM tradeitems T2 WHERE T2.groupid=T1.groupid AND T2.itemid=1)";
$q2="Count(SELECT id FROM tradeitems T3 WHERE T3.groupid=T1.groupid AND T3.itemid=3)";
$q3="Count(SELECT id FROM tradeitems T4 WHERE T4.groupid=T1.groupid AND T4.itemid=2)";
$q4="Count(SELECT id FROM tradeitems T5 WHERE T5.groupid=T1.groupid)";

SELECT T1.groupid FROM tradeitems T1 where $q1 $q2 $q3$q4     GROUP BY T1.groupid 

Последний раз редактировалось Pamparam; 05.06.2012 в 17:50.
Pamparam вне форума Ответить с цитированием
Старый 05.06.2012, 18:35   #8
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Еще вариант если itemid не повторяются для одного groupid. Если повторяются, то чуть посложней
Код:
SELECT T1.groupid 
  FROM Table1 T1
  WHERE (
    SELECT COUNT(*) FROM 
      Table1 T2 
      WHERE T2.groupid=T1.groupid AND T2.itemid IN (1,2,6,8,9)) =5
  GROUP BY T1.groupid
В посте #7 намудрил слишком
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 05.06.2012, 20:21   #9
Pamparam
Форумчанин
 
Регистрация: 08.11.2009
Сообщений: 225
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
Еще вариант если itemid не повторяются для одного groupid. Если повторяются, то чуть посложней
Код:
SELECT T1.groupid 
  FROM Table1 T1
  WHERE (
    SELECT COUNT(*) FROM 
      Table1 T2 
      WHERE T2.groupid=T1.groupid AND T2.itemid IN (1,2,6,8,9)) =5
  GROUP BY T1.groupid
В посте #7 намудрил слишком
Спасибо! itemid как раз таки повторяются ) как быть?
Pamparam вне форума Ответить с цитированием
Старый 05.06.2012, 20:46   #10
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Пива поставишь если встретиться прийдётся
Код:
SELECT T1.groupid
  FROM Table1 T1
  WHERE (
    SELECT COUNT(*) FROM
      (SELECT T2.itemid
         FROM Table1 T2
         WHERE T2.groupid=T1.groupid AND T2.itemid IN (1,2,6,8,9)
         GROUP BY T2.itemid) X) = 5
  GROUP BY T1.groupid
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
сводная по отфильтрованным значениям getikalex Microsoft Office Excel 24 03.11.2011 10:42
Разбиение строки по значениям artemavd Общие вопросы Delphi 7 11.11.2010 09:51
Вопрос по диапазонам и значениям PashaNastya Microsoft Office Excel 3 25.03.2010 09:28
Переход от ссылок к значениям! mephist Microsoft Office Excel 5 10.07.2009 16:01
Нарисовать Ellipse по значениям из... Apollo_13 Общие вопросы Delphi 3 17.06.2007 02:53