SQLinfo.ru - Все о MySQL

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

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

Вы не зашли.

#1 18.12.2012 10:31:24

animegirl
Активист
Зарегистрирован: 28.07.2011
Сообщений: 288

Запрос не выдаёт всех данных

Таблицы


CREATE TABLE IF NOT EXISTS `user_friends` (
  `uid` int(10) unsigned NOT NULL,
  `group_id` tinyint(3) unsigned NOT NULL,
  `friends_ids` mediumtext COLLATE utf8_unicode_ci,
  `group_name` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
  PRIMARY KEY (`uid`,`group_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

-- --------------------------------------------------------

--
-- Table structure for table `user_profile`
--

CREATE TABLE IF NOT EXISTS `user_profile` (
  `uid` int(10) unsigned NOT NULL,
  `email` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
  `phone` varchar(20) COLLATE utf8_unicode_ci DEFAULT NULL,
  `nickname` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
  PRIMARY KEY (`uid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

 

Запрос

SELECT *
FROM `way`.`user_friends`
RIGHT JOIN `way`.`user_profile` ON `user_profile`.`uid`
IN (
`user_friends`.`friends_ids`
)
WHERE `user_friends`.`uid` =118
 

Результат

pma написал:

uid     group_id     friends_ids     group_name     uid     email             phone         nickname
118    1    97,116,117    NULL        97    none            none        aaa
118    2    116        dfgfdgf        116    iadshtf@kjsdhf.com    NULL        iadshtf

По моим представлениям, тут не хватает ещё 2 строчек, где group_id был бы 1, а uid 116 и 117


Скажи миру - НЯ!

Неактивен

 

#2 20.12.2012 22:54:24

animegirl
Активист
Зарегистрирован: 28.07.2011
Сообщений: 288

Re: Запрос не выдаёт всех данных

Все уехали в отпуск? yikes


Скажи миру - НЯ!

Неактивен

 

#3 21.12.2012 02:59:46

Shopen
Гуру
Откуда: Москва
Зарегистрирован: 22.10.2007
Сообщений: 362

Re: Запрос не выдаёт всех данных

animegirl написал:

По моим представлениям, тут не хватает ещё 2 строчек, где group_id был бы 1, а uid 116 и 117

Ну во-первых, если вы не относите себя к нации с письмом справа налево, я бы не советовал использовать RIGHT JOIN, ибо читать его трудновато. Т.е. лучше так:


SELECT *
FROM
   `user_profile` LEFT JOIN `user_friends` ON  `user_profile`.`uid` IN (`user_friends`.`friends_ids`)
WHERE
   `user_friends`.`uid` =118

Во-вторых самих данных мы не видим и поэтому понять что там не выдается тоже довольно телепатично.
В третьих как uid может быть 116 и 117 если вы в запросе написали WHERE uid = 118?

Отредактированно Shopen (21.12.2012 03:19:02)

Неактивен

 

#4 21.12.2012 03:05:39

animegirl
Активист
Зарегистрирован: 28.07.2011
Сообщений: 288

Re: Запрос не выдаёт всех данных


INSERT INTO `user_friends` (`uid`, `group_id`, `friends_ids`, `group_name`) VALUES
(118, 1, '97,116,117', NULL),
(118, 2, '116', 'dfgfdgf');

INSERT INTO `user_profile` (`uid`, `email`, `phone`, `nickname`) VALUES
(97, '', '', 'aaa'),
(116, 'iadshtf@kjsdhf.com', NULL, 'iadshtf'),
(117, 'ssdfsfsdf@sdjkhf.df', NULL, 'ssdfsfsdf'),
(118, 'qwert@qwert.com', NULL, 'qwert', 'abcde');
 


Скажи миру - НЯ!

Неактивен

 

#5 21.12.2012 03:07:26

animegirl
Активист
Зарегистрирован: 28.07.2011
Сообщений: 288

Re: Запрос не выдаёт всех данных

Ну я прочитала описание того и другого, прикинула, что мне надо, и так сделала. А по поводу того, что я запрашиваю uid 118, так это с одной таблицы, а он даёт мне список других uid, которые нужно выцепить из второй таблицы.


Скажи миру - НЯ!

Неактивен

 

#6 21.12.2012 03:29:05

Shopen
Гуру
Откуда: Москва
Зарегистрирован: 22.10.2007
Сообщений: 362

Re: Запрос не выдаёт всех данных

LEFT JOIN и RIGHT JOIN это одно и тоже
SELECT * - так лучше не делать, _особенно_ если в разных таблицах одинаковые имена полей - путаница обеспечена

Насчет запроса действительно, ощущение что mysql выбирает только первое значение из тех что указаны в IN, если  ему подставить статический список (97,116,117) то результат, который вы ожидаете. У меня пока версий нет, я так IN никогда не использовал (когда IN скармливается столбец со списком значений) может кто-то  еще подскажет

Отредактированно Shopen (21.12.2012 03:30:27)

Неактивен

 

#7 21.12.2012 03:30:22

animegirl
Активист
Зарегистрирован: 28.07.2011
Сообщений: 288

Re: Запрос не выдаёт всех данных

Было бы не приятно, вроде бы как всё по синтаксису делала ((


Скажи миру - НЯ!

Неактивен

 

#8 21.12.2012 10:44:32

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3878

Re: Запрос не выдаёт всех данных

IN не интерпретирует переданные ему текстовые строки как список, а сравнивает буквально. Поэтому и остаются результаты только с точным совпадением.

Неактивен

 

#9 21.12.2012 21:17:51

evgeny
Гуру
Зарегистрирован: 04.05.2009
Сообщений: 335

Re: Запрос не выдаёт всех данных

animegirl написал:

Было бы не приятно, вроде бы как всё по синтаксису делала ((

Вообще то использовать '97,116,117' вместо простой таблицы связей, это жуткое извращение  :-)  (жуткое для вашей базы :-) )

Но если уже опираться на то что есть
То можно так :


SELECT *
FROM `user_friends`
LEFT JOIN `user_profile` ON
FIND_IN_SET(user_profile.uid,`user_friends`.`friends_ids`)
WHERE `user_friends`.`uid`=118;

Отредактированно evgeny (21.12.2012 21:25:50)

Неактивен

 

#10 22.12.2012 00:04:30

animegirl
Активист
Зарегистрирован: 28.07.2011
Сообщений: 288

Re: Запрос не выдаёт всех данных

rgbeast написал:

IN не интерпретирует переданные ему текстовые строки как список, а сравнивает буквально. Поэтому и остаются результаты только с точным совпадением.

А нету никакой команды, которой можно было бы ему это объяснить? Вообще просто не логично, ведь вроде всё как по мануалу, список, разделён запятыми, но вот такая вот фигня выходит sad


Скажи миру - НЯ!

Неактивен

 

#11 22.12.2012 00:08:09

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3878

Re: Запрос не выдаёт всех данных

evgeny привел выше такую команду, которая сделает требуемое

Неактивен

 

#12 22.12.2012 16:38:36

animegirl
Активист
Зарегистрирован: 28.07.2011
Сообщений: 288

Re: Запрос не выдаёт всех данных

Запрос выдаёт, то, что надо, но почему-то не пользуется индексами в user_profile


Прикрепленные файлы:
Attachment Icon sql.jpg, Размер: 87,313 байт, Скачано: 360

Скажи миру - НЯ!

Неактивен

 

#13 23.12.2012 23:14:52

evgeny
Гуру
Зарегистрирован: 04.05.2009
Сообщений: 335

Re: Запрос не выдаёт всех данных

animegirl написал:

Запрос выдаёт, то, что надо, но почему-то не пользуется индексами в user_profile

Для того чтоб таблицы соединялись по индексам, должна быть реализована таблица связей.

user_friends
------------------
uid    friend_id
118    97
118    116
118    117    

Вообще не совсем понятно что за колонка group_id в таблице user_friends  ? Это типо группы друзей ?
Если вы собираeтесь вынимать записи не по друзьям а по группам, то тогда структура таблицы должна быть такая

friend_groups
------------------
group_id    uid
1               97
1               116
2               97
2               117

Неактивен

 

#14 24.12.2012 02:09:38

animegirl
Активист
Зарегистрирован: 28.07.2011
Сообщений: 288

Re: Запрос не выдаёт всех данных

Признаться честно, думала, таким способом не дам таблице разрастись до слишком больших размеров, и начать тормозить. Но надо будет подумать на эту тему sad


Скажи миру - НЯ!

Неактивен

 

Board footer

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