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

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() очень долго.

Можно ли сделать другим способом?
 

Glazyrin Sergey

Новичок
Хм задача интересная
Но чото не догнал постановку задачи полностью
Плиз с креатами таблиц и как можно подробней изложи
Поможем
 

Avenus

Under Glory Yield
Хорошо. Возможно лучше по-другому сделать изначально, но мне не приходит в голову как :(

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

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

Я сделал пару таблиц: одну с людьми, другую для просмотренных. Вероятно, лучше по-другому организовать это дело...
 

Glazyrin Sergey

Новичок
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
Что то типа такого ?
 

Avenus

Under Glory Yield
Насчет таблиц (это документы пользователей):
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)
А вот теперь как снова пару выбрать, которая не показывалась мне перед этим, проблема :)
 

Avenus

Under Glory Yield
Glazyrin Sergey, кстати про WHERE ... IS NULL
Поле user_id должно быть NULL по умолчанию?

-~{}~ 06.02.09 00:13:

Ты все понял :) написал почти тоже самое, что и у меня...
И даже добавил возможно решение, я попробую!
 

Glazyrin Sergey

Новичок
Нет
это прием, который позволяет выбрать все записи для которых нет соответствующей записи в T2.
 

Avenus

Under Glory Yield
А, вон оно, что ... спасибо! :) Буду пробовать, потом отпишусь, обязательно!
 

Avenus

Under Glory Yield
Glazyrin Sergey, отлично! Получилось! :)
Получается, ты меня научил немного... как бы такой ситуации ни разу не было за 4 года программирования.

Теперь буду знать, что значит проверка на IS NULL
Спасибо! ;)
 

Glazyrin Sergey

Новичок
А вот все таки интересно как тут грамотно сделать ORDER BY RAND()
Ну имхо можно выбрать айдишники без ORDER BY RAND()
затем сделать array_rand и т.д.
Что думает общественность ?
 

zerkms

TDD infected
Команда форума
Glazyrin Sergey
да вообще можно закинуть всё в текстовый файл. а уже в пхп - array_rand, array_search...
 

vonica

Новичок
...
WHERE t1.id NOT IN (SELECT id FROM T2 )

вообщем так попробуй, может там че подправить не хоче разбираться, но на сто уверен работать будет
 

x-yuri

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