Нужен совет, как организовать порядок запросов:
Вообщем есть кое-какая голосовалка и суть работы в следующем:
1. При открытии страницы из базы данных выбирается случайная запись за которую нужно проголосовать.
2. После голосования в другую таблицу записывается id записи. время, и ip проголосовавшего.
3. При следующем открытии страницы опять выбирается случайная запись. и т.д.
Нужно чтоб не было повторов голосования одного ip адреса за одну и ту же запись ...
Ясно что при открытии страницы и выборе из БД записи нужно проверить не голосовал ли за эту запись пользователь с текущим ip…
Как выбрать из таблицы запись, ту за которую пользователь с текущим ip не голосовал. ...
(как делать запросы я знаю… логики не пойму)
нужно по кукам или еще както идентифицировать
и для понятности вы не сказали — у вас все имеют возможность голосовать или только зарегистрированные
Допустим делаю случайную быборку записи из БД с id = 1, затем проверяю голосовал ли за эту запись пользователь.
Если нет хорошо — загружаем запись, а если да? Не перезагружать же страницу… можно конечно вывести запись, что вы уже тут голосовали, но нужно загрузить именно ту за которую не голосовали
sql = "SELECT f.*, t.* FROM `1_таблица` f LEFT JOIN `2_таблица` t ON t.field_id = f.id WHERE t.ip != 'сюда вставляем ip пользователя'";
Думаю, суть понятна.
Здесь подразумевается, что во второй таблице есть поле field_id, содержащий id записи с первой таблицы, и поле ip, содержащий ip пользователя.
Предчувствую тут косяк из-за того, что в таблице_2 одному id таблицы_1 могут соответствовать несколько строк
Да, можно и так. Но вроде TC хочет, чтобы если пользователь голосовал за запись, то запись больше не должна ему показываться. Получается при первом открытии страницы нужно всё равно проверить голосовал ли он уже. Иначе он может вернуться и через час и увидит запись, за которую уже голосовал.но не разумней ли для начала показать новичку простой запрос, а уже потом склейку таблиц
Упс. Точно. Устраняется просто. Добавляем в конец запросаПредчувствую тут косяк из-за того, что в таблице_2 одному id таблицы_1 могут соответствовать несколько строк
GROUP BY f.id
Да, можно и так. Но вроде TC хочет, чтобы если пользователь голосовал за запись, то запись больше не должна ему показываться. Получается при первом открытии страницы нужно всё равно проверить голосовал ли он уже. Иначе он может вернуться и через час и увидит запись, за которую уже голосовал.
имел ввиду следущее:
выборка из таблицы
получение результата
выбрка из результата нужного значения
цикл
проверка
конец цикла
Пункт "проверка" подразумевает ещё одно обращение к БД, ко второй таблице. Что оптимальнее один сложный запрос или 2 простых, это решать тому, кто пишет. В любом случае, можно написать оба варианта и проверить, что быстрее выполняется. Но я бы сделал одним запросом. Во-первых, более короткий код, во-вторых, всё равно, думаю, один запрос(хоть и сложный) будет быстрее.
В общем, решение есть. ТС проверять и выбирать, что лучше )
но не разумней ли для начала показать новичку простой запрос
имел ввиду следущее:
выборка из таблицы
получение результата
выбрка из результата нужного значения
цикл
проверка
конец цикла
МЕГА-нерационально!!! Не надо новичков такому учить!!! :)))
Упс. Точно. Устраняется просто. Добавляем в конец запроса
Код PHP:
GROUP BY f.id
не уверен…
можно воспользоваться INNER JOIN, если я правильно понял задачу.LEFT JOIN `2_таблица` t ON t.field_id = f.id
очень ресурсоемкая операцияORDER BY rand( )
Как обычно в своём репертуаре!!! :))))очень ресурсоемкая операция
не проще написать менее ресурсоёмкую операцию!? Все будут только благодарны!!! А так какой прок от Вашего сообщения??
пояснитеКак обычно в своём репертуаре!!! :))))
не проще написать менее ресурсоёмкую операцию!?
Прочитать выше религия не позволяет?можно воспользоваться INNER JOIN, если я правильно понял задачу.