Форум программистов, компьютерный форум, киберфорум
MySQL
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
0 / 0 / 1
Регистрация: 03.06.2012
Сообщений: 33
1

Выбрать ID соответствующие двум условиям

11.04.2017, 16:38. Показов 962. Ответов 7
Метки нет (Все метки)

| ID | meta_name | meta_value
-------------------------------------
|1| name1 | 48 |
|1| name2 | 6 |
|1| name3 | 7 |
|2| name1 | 48 |
|2| name2 | 6 |
|2| name3 | 12 |
|3| name1 | 48 |
|3| name2 | 19 |
|3| name3 | 7 |

Как выбрать id, у которых (meta_name=name1 and meta_value=48) and (meta_name=name2 and meta_value=6)?
Т.е. в результате должно быть выбрано 1 и 2
0

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
11.04.2017, 16:38
Ответы с готовыми решениями:

В запросе к БД фигурируют 3 таблицы. Нужны данные по двум условиям
1. Первая таблица oc_product. Берем поля model и geolocation 2. Вторая таблица...

Выбрать пароли, соответствующие заданным условиям
Здравствуйте!Нужна помощь.Спасибо за ранее. Ученик подбирает себе новый пароль. Он хочет, чтобы...

Как выбрать из коллекции элемент по двум условиям без прохода по всем элементам
Есть коллекция ObservableCollection<Class1>, содержащая экземпляры класса Class1. Как можно не...

Найти значения, соответствующие условиям
Ребят, помогите пожалуйста. Мне необходимо отобрать номера предприятий удовлетворяющие интервалу. и...

7
1037 / 854 / 334
Регистрация: 08.12.2016
Сообщений: 3,283
11.04.2017, 17:30 2
(meta_name=name1 and meta_value=48) OR (meta_name=name2 and meta_value=6)
0
0 / 0 / 1
Регистрация: 03.06.2012
Сообщений: 33
11.04.2017, 18:41  [ТС] 3
Цитата Сообщение от YuryK Посмотреть сообщение
(meta_name=name1 and meta_value=48) OR (meta_name=name2 and meta_value=6)
Ваш вариант выберет 1, 2 и 3
0
1037 / 854 / 334
Регистрация: 08.12.2016
Сообщений: 3,283
12.04.2017, 01:05 4
Цитата Сообщение от pashin76 Посмотреть сообщение
Ваш вариант выберет 1, 2 и 3
а ещё 2 и 5

тему надо было точнее формулировать. Я и не обратил внимание, что у вас записи с нужными условиями повторяются, а нужно взять только одну, c наименьшим Id

Добавлено через 51 минуту
SQL
1
2
3
4
5
SELECT * FROM tbl WHERE ID IN (
  SELECT MIN(ID) FROM tbl 
  WHERE  (meta_name='name1' AND meta_value=48) OR (meta_name='name2' AND meta_value=6)
  GROUP BY meta_name, meta_value
)
0
0 / 0 / 1
Регистрация: 03.06.2012
Сообщений: 33
12.04.2017, 08:14  [ТС] 5
Цитата Сообщение от YuryK Посмотреть сообщение
SQLВыделить код
SQL
1
2
3
4
5
SELECT * FROM tbl WHERE ID IN (
* SELECT MIN(ID) FROM tbl 
* WHERE *(meta_name='name1' AND meta_value=48) OR (meta_name='name2' AND meta_value=6)
* GROUP BY meta_name, meta_value
)
Немного не то, мне нужны только ID соответствующие всем (двум) условиям. В вашем примере достаточно соответствия одному условию. Зачем нужен MIN(ID) вообще не понял.
Вот пример запроса, который я составил на основе вашего, но уж больно он кривой у меня получился )
SQL
1
2
3
4
5
6
7
8
9
SELECT ID FROM tbl WHERE ID IN (
* SELECT ID FROM tbl 
* WHERE *(meta_name='name1' AND meta_value=48)
* GROUP BY ID)
AND  ID IN (
* SELECT ID FROM tbl 
* WHERE *(meta_name='name2' AND meta_value=6)
* GROUP BY ID)
)
0
1037 / 854 / 334
Регистрация: 08.12.2016
Сообщений: 3,283
12.04.2017, 08:33 6
Цитата Сообщение от pashin76 Посмотреть сообщение
мне нужны только ID соответствующие всем (двум) условиям. В вашем примере достаточно соответствия одному условию
вы полагаете, что meta_name может быть одновременно рано и 'name1' и 'name2'. Такого не бывает.
А вот когда
(meta_name='name1' AND meta_value=48) OR (meta_name='name2' AND meta_value=6)
то этому условию удовлетворяют и строки
|1| name1 | 48 |
|2| name1 | 48 |
|3| name1 | 48 |
и строки
|1| name2 | 6 |
|2| name2 | 6 |
но не удовлетворяют строки
|1| name3 | 7 |
|2| name3 | 12 |
|3| name2 | 19 |
|3| name3 | 7 |
вы разве не этого хотели?
Цитата Сообщение от pashin76 Посмотреть сообщение
Т.е. в результате должно быть выбрано 1 и 2
Цитата Сообщение от pashin76 Посмотреть сообщение
Зачем нужен MIN(ID) вообще не понял.
вы же не хотите все 5 строк, удовлетворяющих вашему условию
|1| name1 | 48 |
|2| name1 | 48 |
|3| name1 | 48 |
|1| name2 | 6 |
|2| name2 | 6 |
вы хотите только 2 из них
|1| name1 | 48 |
|1| name2 | 6 |
а это именно те, которые имеют меньший Id при всех прочих равных условиях. Или вы их как-то иначе выделили из пяти? Объясните как

Добавлено через 5 минут
Цитата Сообщение от pashin76 Посмотреть сообщение
мне нужны только ID соответствующие всем (двум) условиям
хоть мы и говорим "А и Б сидели на трубе", но в запросе пишем OR
SELECT * FROM НаТрубе WHERE Кто = 'А' OR Кто = 'Б'
А
Б
0
0 / 0 / 1
Регистрация: 03.06.2012
Сообщений: 33
12.04.2017, 08:42  [ТС] 7
Нужны id для которых есть 2 записи (meta_name='name1' AND meta_value=48) И (meta_name='name2' AND meta_value=6)

Строка |3| name1 | 48 | не должна удовлетворять условию, т.к. для ID=3 нет строки с (meta_name='name2' AND meta_value=6)

Т.е. запрос должен сначала получить
|1| name1 | 48 |
|1| name2 | 6 |
|2| name1 | 48 |
|2| name2 | 6 |
, затем сгруппировать их по ID
и выдать
|1|
|2|
То, что требуемые id минимальные, это частный случай
0
1037 / 854 / 334
Регистрация: 08.12.2016
Сообщений: 3,283
12.04.2017, 09:03 8
Цитата Сообщение от pashin76 Посмотреть сообщение
Т.е. в результате должно быть выбрано 1 и 2
Цитата Сообщение от pashin76 Посмотреть сообщение
и выдать
|1|
|2|
ну наконец то найдено главное отличие

Цитата Сообщение от pashin76 Посмотреть сообщение
Вот пример запроса, который я составил на основе вашего, но уж больно он кривой у меня получился
GROUP BY там лишний, а так вполне имеет право на жизнь.
Можно ещё так попробовать
SQL
1
2
3
4
SELECT q1.id FROM
  (SELECT Id FROM tbl  WHERE meta_name='name1' AND meta_value=48) q1
  JOIN  (SELECT Id FROM tbl  WHERE meta_name='name2' AND meta_value=6) q2
ON  q1.Id = q2.Id
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
12.04.2017, 09:03

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Определить количество членов последовательности A1...An, соответствующие условиям
Даны натуральные числа n, A1, ..., An. Определить количество членов Ak последовательности A1, ...,...

Поиск по двум условиям
Здравствуйте! Сделал поиск по двум условиям. При вводе названия улицы в одно из условий ничего не...

Фильтрация по двум условиям
у меня есть таблица Ttabel и в ней поле год мне надо отфильтровать данные по двум значениям из...

Архивация по двум условиям
Доброго времени суток, подскажите пожалуйста как архивировать либо раз в 1ч либо по изменению,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.