Модераторы: skyboy, SamDark
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Сортировка одной таблице на основе другой, подскажите что не так делаю 
V
    Опции темы
maxipub
Дата 2.6.2016, 13:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 504
Регистрация: 22.10.2009

Репутация: 1
Всего: 1



Добрый день!

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

Код
--
-- Структура таблицы `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 
PM MAIL   Вверх
ksnk
Дата 2.6.2016, 13:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6757
Регистрация: 13.4.2007
Где: СПб

Репутация: 1
Всего: 379



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


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
igorold
Дата 2.6.2016, 13:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 557
Регистрация: 22.12.2005
Где: Россия->Урал-& gt;Миасс

Репутация: 5
Всего: 17



Почему у вас user_id везде одинаковый =1 ?

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


--------------------
... у семи нянек 14 сисек ...  
Putin here, Putin there, Putin almost everywhere!
PM MAIL   Вверх
maxipub
Дата 2.6.2016, 13:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 504
Регистрация: 22.10.2009

Репутация: 1
Всего: 1



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
PM MAIL   Вверх
ksnk
Дата 2.6.2016, 13:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6757
Регистрация: 13.4.2007
Где: СПб

Репутация: 1
Всего: 379



ON (s.id=d.id and s.user_id=d.user_id)
Может так? 


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
igorold
Дата 2.6.2016, 14:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 557
Регистрация: 22.12.2005
Где: Россия->Урал-& gt;Миасс

Репутация: 5
Всего: 17



Почему группировка по id???


--------------------
... у семи нянек 14 сисек ...  
Putin here, Putin there, Putin almost everywhere!
PM MAIL   Вверх
maxipub
Дата 2.6.2016, 14:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 504
Регистрация: 22.10.2009

Репутация: 1
Всего: 1



Блин, сорри. Там большой запрос, и эта часть в нем не получается. Чтобы не отвлекать, решил выделить ее. Но сделал это не корректно, там чуть другая структура получается. Сейчас постараюсь переделать.
PM MAIL   Вверх
igorold
Дата 2.6.2016, 14:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 557
Регистрация: 22.12.2005
Где: Россия->Урал-& gt;Миасс

Репутация: 5
Всего: 17



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


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


--------------------
... у семи нянек 14 сисек ...  
Putin here, Putin there, Putin almost everywhere!
PM MAIL   Вверх
maxipub
Дата 2.6.2016, 14:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 504
Регистрация: 22.10.2009

Репутация: 1
Всего: 1



Итак, еще раз сорри, попытка №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 
PM MAIL   Вверх
ksnk
Дата 2.6.2016, 15:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6757
Регистрация: 13.4.2007
Где: СПб

Репутация: 1
Всего: 379



Код

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, данные не пропали.


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
Akina
Дата 2.6.2016, 15:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20331
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 103
Всего: 446



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


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
maxipub
Дата 2.6.2016, 16:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 504
Регистрация: 22.10.2009

Репутация: 1
Всего: 1



Цитата(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 
PM MAIL   Вверх
Google
  Дата 19.7.2018, 01:11 (ссылка)  





  Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | MySQL | Следующая тема »


 




[ Время генерации скрипта: 0.0799 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.