Javascript-форум (https://javascript.ru/forum/)
-   Оффтопик (https://javascript.ru/forum/offtopic/)
-   -   Чем занимаются JS-программеры. (https://javascript.ru/forum/offtopic/14704-chem-zanimayutsya-js-programmery.html)

micscr 28.01.2011 13:47

а что - можно свои ответы? Я так понял задание - Гозару, который обходится листиком sql запросов?

x-yuri 28.01.2011 14:15

нет, задание в первую очередь тем, кто не знает, как такие вещи делаются. Хотя именно такой вариант, думаю, достаточно редкий

Gozar 28.01.2011 19:54

удалено.

x-yuri 28.01.2011 20:50

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

Gozar 28.01.2011 21:08

удалено.

Gozar 28.01.2011 21:15

удалено.

x-yuri 29.01.2011 03:26

будут, просто во-первых я тоже бываю занят, а во-вторых я не вкурил твою идею с первого раза, поэтому решил отложить ее на попозже

т.е. в таблицу banlist пишется кто забанил (user_id) и кого забанили (ban_id), причем при добавлении пользователя в banlist сразу же вставляется запись с ban_id = 0. А при бане мы должны сначала узнать из таблицы users банил ли этот пользователь раньше (flag_banned = 1). Если банил вставляем в banlist новую запись, иначе обновляем существующую. Но если пользователь A забанил пользователя B, то он не должен видеть пользователя B, а у тебя видит:
Код:

drop table if exists banlist;
create table banlist (user_id int, ban_id int);
insert into banlist values (1, 2), (2, 0);
select user_id from banlist where ban_id != 1 and user_id != 1;
+---------+
| user_id |
+---------+
|      2 |
+---------+

и наоборот, но это у тебя работает. Кроме того, на каждый бан нужно выполнить три запроса select users + insert/update banlist + update users. Не хорошо, теоретически можем потерять данные. Если пользователь отправит 2 запроса бана разных пользователей, тогда один из банов может потеряется. Не уверен, что такая ситуация может возникнуть в real life, но по-крайней мере этого лучше избежать, если есть такая возможность

x-yuri 29.01.2011 06:20

точнее наоборот тоже не работает
Код:

drop table if exists banlist;
create table banlist (user_id int, ban_id int);
insert into banlist values (1, 2), (1, 3), (2, 0), (3, 0);
select user_id from banlist where ban_id != 2 and user_id != 2;
+---------+
| user_id |
+---------+
|      1 |
|      3 |
+---------+


micscr 29.01.2011 09:15

Код:

CREATE TABLE IF NOT EXISTS `users` (
  `idu` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(30) NOT NULL,
  PRIMARY KEY (`idu`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=8 ;

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

INSERT INTO `users` (`idu`, `name`) VALUES (1, 'a'),(2, 'b'),(3, 'c'),(4, 'd'),(5, 'f'),(6, 'g'),(7, 'k');

CREATE TABLE IF NOT EXISTS `banned` (
  `idu` int(11) NOT NULL,
  `idb` int(11) NOT NULL,
  PRIMARY KEY (`idu`,`idb`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

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

INSERT INTO `banned` (`idu`, `idb`) VALUES (2, 3),(3, 4),(3, 5),(4, 2);

-- Запрос

SELECT u.idu
FROM users u
WHERE u.idu != $idu
AND u.idu NOT IN
  (
    SELECT IF(b.idu = $idu, b.idb, b.idu)
    FROM banned b
    WHERE b.idu = $idu OR b.idb = $idu
  )
ORDER BY RAND()
LIMIT 1


micscr 29.01.2011 09:21

Цитата:

Сообщение от Gozar
ps: а чего комментариев не будет, типа - реализация говно, жизнь фуфло или ещё каких-нибудь?

Ты делаешь запрос к одной таблице(banlist), т.е. предполагаешь, что в этой таблице обязательно встречаются id-шники всех юзверей?


Часовой пояс GMT +3, время: 14:55.