SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 31.07.2014 10:45:58

M@xim
Участник
Зарегистрирован: 31.07.2014
Сообщений: 10

Помогите пожалуйста с выборкой по нескольким полям

Доброго времени суток! В базе информация раскидана по полям: id / field_id / field_key / field_type / field_label / field_value / record_id, нужна выборка по record_id, но с несколькими параметрами (field_value) из field_id.
К примеру: есть база цветов; field_id = 1 - стебель: field_value("значение1") - длинный, короткий / field_id = 2 - цвет: field_value("значение2") - желтый, синий. Нужна выборка цветов, длинные и синие, короткие и желтые. Сейчас (см. код ниже) выводит длинные+синие, т.е. из всех цветов находит отдельно длинные и отдельно синие, и складывает, а нужно - цветы, которые длинные, синие и короткие, желтые.

SELECT COUNT(record_id)
FROM table_name t
WHERE
  (field_id,field_value) in ((1,N'значение1'),(2,N'значение2'))
  AND EXISTS(
    SELECT 1
    FROM table_name_cat r
    WHERE r.catid = 1 AND r.record_id = t.record_id
    );

Помогите пожалуйста

Неактивен

 

#2 31.07.2014 11:07:31

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2420

Re: Помогите пожалуйста с выборкой по нескольким полям

Доброго времени суток. Приведите структуры таблиц ( результаты запросов 
SHOW CREATE TABLE `table_name` и SHOW CREATE TABLE `table_name_cat` ), тестовый набор данных (лучше как раз с цветами) и желаемый результат (в виде таблички, а не словесного описания).


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#3 31.07.2014 11:41:55

M@xim
Участник
Зарегистрирован: 31.07.2014
Сообщений: 10

Re: Помогите пожалуйста с выборкой по нескольким полям

`table_name`
field_id    field_key    field_type    field_label    field_value    record_id
1           a1234567    select         цвет              желтый      1
2           a89            select         стебель          длинный     1
1           a1234567    select         цвет                синий       2
2           a89            select         стебель          короткий    2
1           a1234567    select         цвет                синий        3
2           a89            select         стебель          короткий    3
1           a1234567    select         цвет                синий        4
2           a89            select         стебель          короткий    4


`table_name_cat`
id    catid    record_id
1    1           1
2    1           2
3    1           3
4    1           4

Результат: 1 цветок желтый длинный и 3 цветка синих коротких (не знаю как в виде таблички оформить результат)
Как-то так

Отредактированно M@xim (31.07.2014 11:45:53)

Неактивен

 

#4 31.07.2014 16:39:07

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2420

Re: Помогите пожалуйста с выборкой по нескольким полям

Ну, поехали.

Данные хотелось увидеть вот так smile :

create table table_name_7155(field_id int, field_key varchar(255), field_type varchar(255),
field_label varchar(255), field_value varchar(255), record_id int) DEFAULT CHARSET=utf8;

create table table_name_cat_7155(id int, catid int, record_id int) DEFAULT CHARSET=utf8;

insert into table_name_7155 values
(1,           'a1234567','select','цвет',   'желтый',  1),
(2,           'a89',     'select','стебель','длинный', 1),
(1,           'a1234567','select','цвет',   'синий',   2),
(2,           'a89',     'select','стебель','короткий',2),
(1,           'a1234567','select','цвет',   'синий',   3),
(2,           'a89',     'select','стебель','короткий',3),
(1,           'a1234567','select','цвет',   'синий',   4),
(2,           'a89',     'select','стебель','короткий',4);

insert into table_name_cat_7155 values(1,1,1),(2,1,2),(3,1,3),(4,1,4);


Сгруппировать цветы по пропертям можно так:

SELECT record_id,group_concat(field_value ORDER BY 1 ASC) FROM `table_name_7155` tn JOIN `table_name_cat_7155` tnc USING(record_id) GROUP BY record_id;


А отсеять только нужные можно, например, вот так:

SELECT record_id,group_concat(field_value ORDER BY 1 ASC) prop FROM `table_name_7155` tn JOIN `table_name_cat_7155` tnc
USING(record_id) GROUP BY record_id HAVING prop IN ('длинный,желтый');


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#5 01.08.2014 10:53:16

M@xim
Участник
Зарегистрирован: 31.07.2014
Сообщений: 10

Re: Помогите пожалуйста с выборкой по нескольким полям

Запрос для группировки работает отлично, а SELECT record_id,group_concat(field_value ORDER BY 1 ASC) prop FROM `table_name_7155` tn JOIN `table_name_cat_7155` tnc
USING(record_id) GROUP BY record_id HAVING prop IN ('длинный,желтый'); выводит :"MySQL вернула пустой результат (т.е. ноль строк)". И еще вопрос: как быть если категорий несколько, у меня их 70? Заранее спасибо!

Неактивен

 

#6 01.08.2014 11:59:07

M@xim
Участник
Зарегистрирован: 31.07.2014
Сообщений: 10

Re: Помогите пожалуйста с выборкой по нескольким полям

С категориями вроде разобрался, использую (SELECT r.record_id FROM table_name_cat AS r WHERE r.catid = 1), но строчки не находит sad

Отредактированно M@xim (01.08.2014 12:04:56)

Неактивен

 

#7 01.08.2014 13:17:12

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2420

Re: Помогите пожалуйста с выборкой по нескольким полям

Если запрос с группировкой работает, то подберите соответствующий having - чтобы отсеивать ненужное. Насчет 70 категорий - не очень понял вопрос, поясните.


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#8 01.08.2014 13:22:58

M@xim
Участник
Зарегистрирован: 31.07.2014
Сообщений: 10

Re: Помогите пожалуйста с выборкой по нескольким полям

Просто данные разбиты по 70 категориям, т.е. catid содержит значения 1, 2, ... 70 и для выборки из каждой я использую SELECT r.record_id FROM table_name_cat AS r WHERE r.catid = 1(где 1 - номер категории). Здесь вроде сам разобрался

Неактивен

 

#9 01.08.2014 13:44:09

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2420

Re: Помогите пожалуйста с выборкой по нескольким полям

Что касается http://sqlinfo.ru/forum/viewtopic.php?pid=40098#p40098
если не получается отсеять, то  приложите дампы таблиц (с тем набором, с которым не можете договориться), будем посмотреть.


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson