|
|
|
| Добрый день, понадобилось из одной таблицы которая имеет следующую структуру:
ID | user_id | meta_key | meta_value
|
получить user_id и meta_value которые соответствуют трем условиям.
Не могу разобраться, что сделал не правильно. Данные получаю но не те которые соответствуют всем условиям. Пишу следующий запрос:
SELECT t3.user_id, t3.meta_value
FROM site_usermeta t3
INNER JOIN site_usermeta t1
on t1.user_id = t3.user_id
and t1.meta_key = 'pole1'
and t1.meta_value > '0'
INNER JOIN site_usermeta t2
on t2.user_id = t3.user_id
and t2.meta_key = 'pole2'
and t2.meta_value != '2'
WHERE t3.meta_key = 'pole3'
and t3.meta_value != ''
ORDER BY RAND() LIMIT 1
|
| |
|
|
|
|
|
|
|
для: ZetRider
(01.06.2012 в 09:10)
| | > Данные получаю но не те которые соответствуют всем условиям.
Если данные соответствуют НЕ ВСЕМ условиям, то возвращается NULL.
Следовательно если вы получаете данные, значит они соответствуют ВСЕМ условиям запроса! Это всегда так и второго не дано.
Следовательно либо вы требуемые условия не корректно переводите на язык SQL, либо не правильно понимаете логику запроса.
Подходим к главному.....
> получить user_id и meta_value которые соответствуют трем условиям.
И где эти условия?
Или вы предлагаете понять их из вашего неправильного запроса?
А если я думаю также как SQL (что скорее всего так и есть)?
Только SQL пока знает больше чем я..... Знает типы полей таблицы, знает какие в таблице данные....
Опишите таблицу (SHOW CREATE TABLE site_usermeta),
опишите условия выборки словами,
приведите пример данных (хотя бы несколько строк),
покажите что должно быть выбрано ВЕРНЫМ запросом именно из этих данных.
....Тогда будем посмотреть. | |
|
|
|
|
|
|
|
для: Sfinks
(01.06.2012 в 11:40)
| |
--
-- Структура таблицы `site_usermeta`
--
CREATE TABLE IF NOT EXISTS `site_usermeta` (
`ID` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`user_id` bigint(20) unsigned NOT NULL DEFAULT '0',
`meta_key` varchar(255) DEFAULT NULL,
`meta_value` longtext,
PRIMARY KEY (`ID`),
KEY `user_id` (`user_id`),
KEY `meta_key` (`meta_key`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=79 ;
|
Выбрать user_id и meta_value в таблице site_usermeta
где
meta_key = pole1 и его значение больше нуля
где
meta_key = pole2 и его значение не равно двум
где
meta_key = pole3 и его значение не пустое
Данные в таблице:
ID | user_id | meta_key | meta_value
1 | 1 | pole1 | -15
2 | 1 | pole2 | 2
3 | 1 | pole3 |
4 | 2 | pole1 | 5
5 | 2 | pole2 | 19
6 | 2 | pole3 | текст
Конечно же meta_value это не тип INT, даже можно забыть про этот пример, он не корректен.
Главный мой вопрос заключается в том, как правильно из подобной структуры таблицы получить поле user_id которое соответствует 3 или более параметрам?
Или исользовать порнографию ?
SELECT t1.user_id FROM site_usermeta AS t1, site_usermeta AS t2, site_usermeta AS t3
|
| |
|
|
|
|
|
|
|
для: ZetRider
(15.06.2012 в 10:47)
| | Можно так:
SELECT user_id, max(if(meta_key = 'pole3',meta_value,''))p3
FROM site_usermeta
GROUP BY user_id
HAVING sum(if(meta_key = 'pole1',meta_value,0))>0
AND sum(if(meta_key = 'pole2',meta_value,0))<>2
AND p3<>''
| Это при условии, что:
1. Для каждого user_id есть одна строка с meta_key='pole1' (именно одна и есть обязательно), одна для поле2 и одна для поле3.
2. meta_value в строках с поле1 и поле2 всегда числовое. Иначе нужно доп. проверки добавлять на null и т.п.
Вообще нужно не допускать такой структуры бд. | |
|
|
|
|
|
|
|
для: Sfinks
(15.06.2012 в 14:56)
| | Спасибо за ответ, ожидал что то по проще.
Данная структура используется в wordpress | |
|
|
|
|
|
|
|
для: ZetRider
(15.06.2012 в 16:07)
| | При такой структуре в MySQL это простейшее, что может быть. В MS, там есть оператор, который производит это скрытно. Но тут так.
При чем, хочу заметить, что это довольно медленный и ресурсоемкий запрос (по сравнению с обычной выборкой). Поэтому повторюсь!
нужно не допускать такой структуры бд | |
|
|
|