SQLinfo.ru - Все о MySQL Webew.ru: теория и практика веб-технологий

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

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

Вы не зашли.

#1 31.10.2008 15:31:34

Proger
Активист
Откуда: Санкт-Петербург
Зарегистрирован: 04.09.2008
Сообщений: 172

Условие != и left join

Странно... но запрос:


SELECT `online`.`uid`
FROM `user`.`friend`
LEFT JOIN `user`.`online` ON `online`.`uid` = `friend`.`fid`
WHERE `friend`.`mid` =2
AND `online`.`uid` !=0
AND `online`.`xstas` !=12
GROUP BY `online`.`name` , `online`.`uid`
ORDER BY RAND( )
LIMIT 0 , 2
 


выводит строку даже если в ней xstas == 12

в чем может быть причина?

В качестве пояснения скажу, что это вывод списка друзей онлайн на сайте. Я ставлю статус невидим для всех (что равно xstas 12), но меня видят всё равно.

Отредактированно Proger (31.10.2008 15:34:24)

Неактивен

 

#2 31.10.2008 21:50:36

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

Re: Условие != и left join

Может быть в том, что в таблице есть еще одна строка с теми же name и uid, но с xstas!=12.

Неактивен

 

#3 01.11.2008 09:04:35

Proger
Активист
Откуда: Санкт-Петербург
Зарегистрирован: 04.09.2008
Сообщений: 172

Re: Условие != и left join

uid уникально, это номер пользователя

Неактивен

 

#4 01.11.2008 12:13:22

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

Re: Условие != и left join

Замените на SELECT * и посмотрите что получается. GROUP BY явно избыточный, раз поле уникальное. Вообще говоря не совсем корректно накладывать условия на поля, по которым не производится группировка.

Неактивен

 

#5 01.11.2008 15:30:04

Proger
Активист
Откуда: Санкт-Петербург
Зарегистрирован: 04.09.2008
Сообщений: 172

Re: Условие != и left join

Убрал GROUP BY по online.name...

Сделал SELECT *

получил туже результатину... вижу чела с xstas 12 sad Тока ещё в добавок все поля их обоих таблиц... sad(

Неактивен

 

#6 01.11.2008 15:37:01

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

Re: Условие != и left join

А если убрать GROUP BY вообще?

Неактивен

 

#7 01.11.2008 21:27:39

Proger
Активист
Откуда: Санкт-Петербург
Зарегистрирован: 04.09.2008
Сообщений: 172

Re: Условие != и left join

всё равно sad даже попробывал скинуть кеш таблиц. flush сделал. Не катит и всё тут sad Вроде раньше работало, что случилось не понимаю...

Неактивен

 

#8 01.11.2008 21:33:57

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

Re: Условие != и left join

INNER JOIN такой же результат дает? Приведите тогда дамп таблиц.

Неактивен

 

#9 02.11.2008 08:42:27

Proger
Активист
Откуда: Санкт-Петербург
Зарегистрирован: 04.09.2008
Сообщений: 172

Re: Условие != и left join

INNER дал такой же результат.
Кажись (моё мнение) глюк из-за типа поля xstas. Кажись как с tinyint(2) на enum заменил лагать начало...

Дампы:


--
-- База данных: `user`
--

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

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

CREATE TABLE `online` (
  `sid` varchar(32) NOT NULL,
  `uid` int(4) NOT NULL default '0',
  `name` varchar(20) NOT NULL,
  `time` int(12) NOT NULL,
  `ip` varchar(15) default NULL,
  `where_type` varchar(11) NOT NULL default 'index',
  `where_id` int(8) default NULL,
  `where_id1` int(8) default NULL,
  `where_id2` int(8) default NULL,
  `xstas` enum('0','1','2','3','4','5','6','7','8','9','10','11','12') NOT NULL default '0',
  PRIMARY KEY  (`sid`),
  KEY `all_data` (`uid`,`name`,`time`,`ip`,`where_type`,`where_id`,`where_id1`,`where_id2`,`xstas`),
  KEY `main_sid` (`sid`,`time`),
  KEY `uid` (`uid`,`xstas`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251;

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

INSERT INTO `online` VALUES('d2dc20b34eb7fae1537cc40b6f0260a1', 1, 'Krevedko', 1225604226, 'xxx.xxx.xxx.xxx', 'page', 42, 0, 0, '12');
INSERT INTO `online` VALUES('f53b3fa601786333784eb6a613b0908c', 0, 'Гость', 1225604137, 'xxx.xxx.xxx.xxx', 'photo-memb', 1, 12, 61, '0');

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

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

CREATE TABLE `friend` (
  `mid` int(8) NOT NULL,
  `fid` int(8) NOT NULL,
  KEY `mid` (`mid`,`fid`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251;

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

INSERT INTO `friend` VALUES(1, 2);
INSERT INTO `friend` VALUES(1, 4);
INSERT INTO `friend` VALUES(1, 5);
...
INSERT INTO `friend` VALUES(2, 1);
...
 

Отредактированно Proger (02.11.2008 08:45:30)

Неактивен

 

#10 02.11.2008 09:11:54

Proger
Активист
Откуда: Санкт-Петербург
Зарегистрирован: 04.09.2008
Сообщений: 172

Re: Условие != и left join

Точняк... переделал в tinyint(2) всё ок стало. А в чем недочёт то? Просто у меня 13 значений поля xstas, я подумал что чем задавать диапозон, я перечислю все значения...

Неактивен

 

#11 02.11.2008 13:29:49

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

Re: Условие != и left join

Для enum '12' у Вас соответствовало числовому значению 13.

select xstas+0 from online;
+---------+
| xstas+0 |
+---------+
|       1 |
|      13 |
+---------+
2 rows in set (0.00 sec)

Или надо было со строковым значением работать xstas!='12'

Неактивен

 

#12 02.11.2008 16:29:40

Proger
Активист
Откуда: Санкт-Петербург
Зарегистрирован: 04.09.2008
Сообщений: 172

Re: Условие != и left join

Во как! Спасибо, буду знать на будущее!

Неактивен

 

Board footer

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