Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > MySQL > Сортировка одной таблице на основе другой


Автор: maxipub 2.6.2016, 13:32
Добрый день!

Есть таблицы:

Код
--
-- Структура таблицы `q_data`
--

CREATE TABLE IF NOT EXISTS `q_data` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `user_id` int(10) unsigned NOT NULL,
  `data` varchar(32) NOT NULL,
  UNIQUE KEY `id` (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=cp1251 AUTO_INCREMENT=4 ;

--
-- Дамп данных таблицы `q_data`
--

INSERT INTO `q_data` (`id`, `user_id`, `data`) VALUES
(1, 1, 'aaa'),
(2, 1, 'bbb'),
(3, 1, 'ccc');

--
-- Структура таблицы `q_sort`
--

CREATE TABLE IF NOT EXISTS `q_sort` (
  `id` int(10) unsigned NOT NULL,
  `user_id` int(10) unsigned NOT NULL,
  `sort` int(10) unsigned NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=cp1251;

--
-- Дамп данных таблицы `q_sort`
--

INSERT INTO `q_sort` (`id`, `user_id`, `sort`) VALUES
(2, 1, 1),
(1, 1, 2),
(3, 1, 3);


Нужно q_data отсортировать по q_sort.sort для user_id. Делаю так:

Код
SELECT * FROM q_data AS d 
INNER JOIN q_sort AS s ON s.user_id=d.user_id 
GROUP BY d.id 
ORDER BY s.sort ASC


Но что-то результат не радует...

Код
id    user_id    data    id    user_id    sort
1    1    aaa    2    1    1
2    1    bbb    2    1    1
3    1    ccc    2    1    1


Когда жду такого:

Код
id    user_id    data    id    user_id    sort
2    1    bbb    2    1    1
1    1    aaa    2    1    2
3    1    ccc    2    1    3


Что не так делаю? smile 

Автор: ksnk 2.6.2016, 13:52
Дело в том, что ON s.user_id=d.user_id 
user_id в предложенных данных только 1, совсем 1...  smile 

Автор: igorold 2.6.2016, 13:55
Почему у вас user_id везде одинаковый =1 ?

Из-за этого так и получается.

Автор: maxipub 2.6.2016, 13:56
ksnk, это в предложенных данных. В реальности юзер не один. smile Считаем что запрос:

Код

SELECT * FROM q_data AS d 
INNER JOIN q_sort AS s ON s.user_id=d.user_id 
WHERE d.user_id = 1 
GROUP BY d.id 
ORDER BY s.sort ASC


Добавлено через 45 секунд
igorold, юзер одинаковый потому, что это записи одного юзера. smile

Автор: ksnk 2.6.2016, 13:59
ON (s.id=d.id and s.user_id=d.user_id)
Может так? 

Автор: igorold 2.6.2016, 14:03
Почему группировка по id???

Автор: maxipub 2.6.2016, 14:14
Блин, сорри. Там большой запрос, и эта часть в нем не получается. Чтобы не отвлекать, решил выделить ее. Но сделал это не корректно, там чуть другая структура получается. Сейчас постараюсь переделать.

Автор: igorold 2.6.2016, 14:34
Цитата(maxipub @  2.6.2016,  14:14 Найти цитируемый пост)
Но сделал это не корректно, там чуть другая структура получается. 


так видно, что что-то не так ...  smile 

Автор: maxipub 2.6.2016, 14:50
Итак, еще раз сорри, попытка №2 smile

Код
--
-- Структура таблицы `w_data`
--

CREATE TABLE IF NOT EXISTS `w_data` (
  `user_id` int(10) unsigned NOT NULL,
  `some_id` int(10) unsigned NOT NULL,
  `record_id` int(10) unsigned NOT NULL,
  `data` varchar(32) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=cp1251;

--
-- Дамп данных таблицы `w_data`
--

INSERT INTO `w_data` (`user_id`, `some_id`, `record_id`, `data`) VALUES
(1, 1, 1, 'aaa'),
(1, 1, 2, 'bbb'),
(1, 1, 3, 'ccc'),
(1, 2, 1, 'qwerty'),
(1, 3, 1, 'abc'),
(2, 4, 1, 'qazxsw');

--
-- Структура таблицы `w_sort`
--

CREATE TABLE IF NOT EXISTS `w_sort` (
  `user_id` int(10) unsigned NOT NULL,
  `some_id` int(10) unsigned NOT NULL,
  `record_id` int(10) unsigned NOT NULL,
  `sort` int(10) unsigned NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=cp1251;

--
-- Дамп данных таблицы `w_sort`
--

INSERT INTO `w_sort` (`user_id`, `some_id`, `record_id`, `sort`) VALUES
(1, 1, 1, 2),
(1, 1, 2, 1),
(1, 1, 3, 3),
(1, 2, 1, 777),
(1, 3, 1, 888),
(2, 4, 1, 999);


Задача: выбрать из w_data данные для указанных user_id и some_id, с сортировкой по w_sort.sort делаю так:

Код
SELECT * FROM w_data AS d 
INNER JOIN w_sort AS s ON s.some_id=d.some_id 
WHERE d.user_id = 1 AND d.some_id = 1 
GROUP BY d.record_id 
ORDER BY s.sort ASC


Получаю:

Код
user_id    some_id    record_id    data    user_id    some_id    record_id    sort
1    1    1    aaa    1    1    1    2
1    1    2    bbb    1    1    1    2
1    1    3    ccc    1    1    1    2


Вместо ожидаемых:

Код
user_id    some_id    record_id    data    user_id    some_id    record_id    sort
1    1    2    bbb    1    1    1    1
1    1    1    aaa    1    1    1    2
1    1    3    ccc    1    1    1    3


Где я туплю уже второй час??? smile 

Автор: ksnk 2.6.2016, 15:25
Код

SELECT * FROM w_data AS d 
LEFT JOIN w_sort AS s ON (s.some_id=d.some_id and s.user_id=d.user_id and s.record_id=d.record_id)
WHERE d.user_id = 1 AND d.some_id = 1 
ORDER BY s.sort ASC

Тут left join, чтобы при отсутствии записи о сортировке в таблице w_sort, данные не пропали.

Автор: Akina 2.6.2016, 15:55
maxipub, ты сперва без сортировки составь запрос - просто чтобы получить правильные данные, в т.ч. в поле сортировки. А то у тебя и во второй раз хрень какая-то... тем более что группировка у тебя совсем "ниачём".

Автор: maxipub 2.6.2016, 16:33
Цитата(Akina @  2.6.2016,  15:55 Найти цитируемый пост)
без сортировки составь запрос - просто чтобы получить правильные данные, в т.ч. в поле сортировки

Без сортировки? Не совсем понял, при чем она тут. Сортировка ведь влияет лишь на порядок следования того, что уже выбрано? А если выбрано уже не то, то и сортировка непонятно каким боком, она же сам набор данных не меняет?

Вот выбираем что нам надо:

Код
SELECT * FROM w_data WHERE user_id=1 AND some_id=1


Далее джойнил таблицу для сортировки:

Код
SELECT * FROM w_data AS d INNER JOIN w_sort AS s ON s.some_id=d.some_id WHERE d.user_id=1 AND d.some_id=1


Тут мы получали пересечение всех строк... Кароче, я уже понял что тупанул с этим. Нужно было использовать все точки соприкосновения для ON... При еще пришлось на реальном запросе немного потупить - там на самом деле не 3 такие id, а 4, и нужно джойнить по всем 4 чтоб не происходило пересечения, а я чето тупанул и уперся в эту группировку, понимая что она все равно проблемы не решит.... smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)