Как изменить запрос с исключением поля?

  • Автор темы Автор темы Avenus
  • Дата начала Дата начала

Avenus

Under Glory Yield
Как изменить запрос с исключением поля?

Привет всем! :)

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

Две таблицы:
T1: Old, Type, ...
T2: New, User, Sel...

Делаю SELECT из T1 пару разных order by rand() строк.
Я, к примеру, - пользователь и выбираю из 2-х других пользователей с Old1 и Old2 одного.
После этого INSERT в T2 значения New1=Old1 и New2=Old2... для каждой строки в User пишу себя,
а в Sel пишу 1 только для выбранного. Для того, которого не выбрал - пишу 0.

Вот, собственно, сделал просто, но выборка не получается с проверкой на уже показанных :(
Т.е. как мне теперь выбрать из 1-й таблицы другую пару с Old3 и Old4 так, чтобы они мне уже не показывались?

Самое важное! Выбор обязательно должен быть order by rand()!

Получается дополнительная проверка полей в T1 и T2 с совпадением на T1.Old=T2.New и T2.User!="Я", но это невозможно сделать... ничего не выберется.

Единственное, как получается, это выбор, потом проверка, показывался ли мне уже.
И если совпадение, то снова запрос... и так цикл... полный отстой!
Особенно когда будет выбор маленький... цикл будет длиться с order by rand() очень долго.

Можно ли сделать другим способом?
 
Хм задача интересная
Но чото не догнал постановку задачи полностью
Плиз с креатами таблиц и как можно подробней изложи
Поможем
 
Хорошо. Возможно лучше по-другому сделать изначально, но мне не приходит в голову как :(

Ситуация простая:
1. Есть много людей, каждый из которых может друг друга пересмотреть.
2. Показывается 2 разных человека и выбирается один из двух.
3. После показывается другая пара, опять на выбор.
... и так до тех пор, пока больше некого будет выбирать.

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

Я сделал пару таблиц: одну с людьми, другую для просмотренных. Вероятно, лучше по-другому организовать это дело...
 
ORDER BY RAND() пока опустим. не будем думать над этим
тут проблема что выборка то неровная, и мы какие то условия хитрые вводим, поэтому пока забудем про оптимизацию ORDER BY rand()
Идея
T1 - содержит всех людей
T2 - содержит уже просмотренных
она также содержит некий идентификатор, по которому можно понять какой юзер уже просмотрел конкретных пользователей
Про индексы пока забудем. Но они обязательно должны быть
SELECT
*
FROM
T1
LEFT JOIN
T2
ON (
T2.user_id = T1.user_id AND T2.session_id = 'session_id'
)
WHERE
T2.user_id IS NULL
ORDER BY RAND()
LIMIT 2
Что то типа такого ?
 
Насчет таблиц (это документы пользователей):
PHP:
T1: id, owner
T2: id, user, sel
Делаю выбор для пары:
PHP:
(1) Doc1 = SELECT * from T1 where T1.owner!="Я"
(2) Doc2 = SELECT * from T1 where T1.owner!="Я" and T1.id!=Doc1[id]
Выбираю одного из двух (к примеру, я выбрал 2-й):
PHP:
INSERT into T2 (id, user, sel) values (Doc2[id], "Я", 1)
INSERT into T2 (id, user, sel) values (Doc1[id], "Я", 0)
А вот теперь как снова пару выбрать, которая не показывалась мне перед этим, проблема :)
 
Glazyrin Sergey, кстати про WHERE ... IS NULL
Поле user_id должно быть NULL по умолчанию?

-~{}~ 06.02.09 00:13:

Ты все понял :) написал почти тоже самое, что и у меня...
И даже добавил возможно решение, я попробую!
 
Нет
это прием, который позволяет выбрать все записи для которых нет соответствующей записи в T2.
 
А, вон оно, что ... спасибо! :) Буду пробовать, потом отпишусь, обязательно!
 
Glazyrin Sergey, отлично! Получилось! :)
Получается, ты меня научил немного... как бы такой ситуации ни разу не было за 4 года программирования.

Теперь буду знать, что значит проверка на IS NULL
Спасибо! ;)
 
А вот все таки интересно как тут грамотно сделать ORDER BY RAND()
Ну имхо можно выбрать айдишники без ORDER BY RAND()
затем сделать array_rand и т.д.
Что думает общественность ?
 
Glazyrin Sergey
да вообще можно закинуть всё в текстовый файл. а уже в пхп - array_rand, array_search...
 
...
WHERE t1.id NOT IN (SELECT id FROM T2 )

вообщем так попробуй, может там че подправить не хоче разбираться, но на сто уверен работать будет
 
вообщем так попробуй, может там че подправить не хоче разбираться, но на сто уверен работать будет
ну если подправить до варианта Glazyrin Sergey, тогда да, на сто ;-)
 
Сверху