Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Помогите сформировать SQL запрос

6.0K
17 июня 2010 года
grishkov
14 / / 25.08.2004
Добрый день! Как сделать в запросе операцию пересечения множества индексов. Есть таблица такого вида:

id | var1 | var2 | var3
1 | 1 | 0 | 0
1 | 0 | 1 | 0
1 | 0 | 0 | 1
2 | 1 | 0 | 0
2 | 0 | 1 | 0
2 | 0 | 0 | 0

Нужно вывести все id для которых (в разных строках) все var1, var2, var3 равны 1.

В данном примере правильным выводом должен быть id=1
id=2 не подходит т.к. с таким индексом нет var3=1

Заранее спасибо, а то запарился с таким индексом..
8.2K
17 июня 2010 года
bagie2
299 / / 26.10.2008
у меня получилось что-нибудь типа такого

 
Код:
SELECT id
FROM table1
GROUP BY id
HAVING Max(var1)=1 AND Max(var2)=1 AND Max(var3)=1
369
17 июня 2010 года
Kesano
451 / / 09.10.2007
Лаконичный код, товарищ...
Не я топикстартер, но пойду изучать group by и having
8.2K
17 июня 2010 года
bagie2
299 / / 26.10.2008
у меня работает) проверил на MSSQL. у вас какая СУБД?
6.0K
17 июня 2010 года
grishkov
14 / / 25.08.2004
Да, с той ошибкой я разобрался, нужно было сделать селект всех столбцов... К сожалению это не помогло решить мою проблему, поэтому я думаю будет лучше если разместить здесь реальную таблицу.

Есть вот такая таблица:
CREATE TABLE IF NOT EXISTS `tbl_catalog_FieldVal` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`id_product` int(11) NOT NULL,
`id_field` int(11) NOT NULL,
`id_part` int(11) NOT NULL,
`type` text NOT NULL,
`val` text NOT NULL,
`position` int(11) NOT NULL,
PRIMARY KEY (`id`)
)

Нужно вытащить из нее значения столба id_product, которому будут например соответствовать вот такие значения других столбцов:

(id_field=70 AND val=28) AND
(id_field=28 AND position=0 AND val>=100)

Вот некоторые данные из таблицы:
INSERT INTO `tbl_catalog_FieldVal` (`id`, `id_product`, `id_field`, `id_part`, `type`, `val`, `position`) VALUES
(1012, 606, 70, 15, 'sel', '28', 0),
(1062, 605, 70, 15, 'sel', '28', 0),
(2700, 726, 70, 53, 'sel', '28', 0),
(941, 55, 28, 15, 'txt', '120', 0),
(971, 240, 28, 15, 'txt', '110', 0),
(1489, 719, 28, 13, 'txt', '100', 0),
(2109, 634, 28, 35, 'txt', '110', 0),
(2143, 721, 28, 37, 'txt', '150', 0),
(186, 225, 35, 7, 'check', '1', 0),
(187, 225, 37, 7, 'check', '0', 0),
(313, 225, 31, 7, 'sel', '14', 0),
(2113, 634, 42, 36, 'txt', '56', 2);
8.2K
17 июня 2010 года
bagie2
299 / / 26.10.2008
ничего не понятно, что нужно
6.0K
17 июня 2010 года
grishkov
14 / / 25.08.2004
В общем есть каталог который состоит из полей разного типа. Структуру таблицы в котором все это дело хранится я дал и часть данных тоже.

Нужно вытащить из таблицы tbl_catalog_FieldVal все значения id_product без дублей, которые бы одновременно удовлетворяли следующим критериями:
1. (id_field=70 AND val=28)
2. (id_field=28 AND position=0 AND val>=100).

Буду признателен, если вы скажите как вытащить id_product для конкретно этого примера, по аналогии я потом соображу как вытаскивать другие комбинации данных.
6.0K
17 июня 2010 года
grishkov
14 / / 25.08.2004
Через ИЛИ для одной строки нельзя так как в одной строке сразу не может быть одновременно id_field=70 и id_field=28. Поэтому нужно как-то сгруппировать id_product для двух условий) :
1. (id_field=70 AND val=28)
2. (id_field=28 AND position=0 AND val>=100).
8.2K
17 июня 2010 года
bagie2
299 / / 26.10.2008
может быть это имели ввиду, я всё равно не вкурил до конца суть вопроса)

 
Код:
SELECT
    id_product
FROM tbl_catalog_FieldVal
WHERE
    id_field IN (SELECT val FROM tbl_catalog_FieldVal WHERE id_field=70)
    AND position=0
    AND val>=100
339
18 июня 2010 года
verybadbug
619 / / 12.09.2005
Цитата: grishkov
Нужно вытащить из таблицы tbl_catalog_FieldVal все значения id_product без дублей, которые бы одновременно удовлетворяли следующим критериями:
1. (id_field=70 AND val=28)
2. (id_field=28 AND position=0 AND val>=100).



может я чего-то не понимаю, но насколько я знаю логику
id_field=70 и id_field=28 одновременно быть не могут,
равно как val=28 и val>=100

339
18 июня 2010 года
verybadbug
619 / / 12.09.2005
может быть не
(id_field=70 AND val=28) AND
(id_field=28 AND position=0 AND val>=100)

а
(id_field=70 AND val=28) OR
(id_field=28 AND position=0 AND val>=100)

???????
339
18 июня 2010 года
verybadbug
619 / / 12.09.2005
Цитата: grishkov
без дублей


DISTINCT

339
18 июня 2010 года
verybadbug
619 / / 12.09.2005
в общем виде (для MySQL)
 
Код:
SELECT DISTINCT `id_product` FROM `tbl_catalog_FieldVal`
WHERE (`id_field`='70' AND `val`='28') OR (`id_field`='28' AND `position`='0' AND `val`>='100')
8.2K
18 июня 2010 года
bagie2
299 / / 26.10.2008
verybadbug
я уже пытался объяснить это ТС, но похоже тут требуется что-то другое, а что именно пока непонятно :)
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог