Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Сортировка по 3 значениям из 1 столбца (INNER JOIN)
 
 автор: ZetRider   (01.06.2012 в 09:10)   письмо автору
 
 

Добрый день, понадобилось из одной таблицы которая имеет следующую структуру:
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  

  Ответить  
 
 автор: Sfinks   (01.06.2012 в 11:40)   письмо автору
 
   для: ZetRider   (01.06.2012 в 09:10)
 

> Данные получаю но не те которые соответствуют всем условиям.
Если данные соответствуют НЕ ВСЕМ условиям, то возвращается NULL.
Следовательно если вы получаете данные, значит они соответствуют ВСЕМ условиям запроса! Это всегда так и второго не дано.
Следовательно либо вы требуемые условия не корректно переводите на язык SQL, либо не правильно понимаете логику запроса.

Подходим к главному.....
> получить user_id и meta_value которые соответствуют трем условиям.

И где эти условия?
Или вы предлагаете понять их из вашего неправильного запроса?
А если я думаю также как SQL (что скорее всего так и есть)?

Только SQL пока знает больше чем я..... Знает типы полей таблицы, знает какие в таблице данные....

Опишите таблицу (SHOW CREATE TABLE site_usermeta),
опишите условия выборки словами,
приведите пример данных (хотя бы несколько строк),
покажите что должно быть выбрано ВЕРНЫМ запросом именно из этих данных.

....Тогда будем посмотреть.

  Ответить  
 
 автор: ZetRider   (15.06.2012 в 10:47)   письмо автору
 
   для: 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

  Ответить  
 
 автор: Sfinks   (15.06.2012 в 14:56)   письмо автору
 
   для: 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 и т.п.

Вообще нужно не допускать такой структуры бд.

  Ответить  
 
 автор: ZetRider   (15.06.2012 в 16:07)   письмо автору
 
   для: Sfinks   (15.06.2012 в 14:56)
 

Спасибо за ответ, ожидал что то по проще.
Данная структура используется в wordpress

  Ответить  
 
 автор: Sfinks   (15.06.2012 в 22:08)   письмо автору
 
   для: ZetRider   (15.06.2012 в 16:07)
 

При такой структуре в MySQL это простейшее, что может быть. В MS, там есть оператор, который производит это скрытно. Но тут так.

При чем, хочу заметить, что это довольно медленный и ресурсоемкий запрос (по сравнению с обычной выборкой). Поэтому повторюсь!

нужно не допускать такой структуры бд

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования