@planchek

Как сделать такую фильтрацию в mysql?

Разрабатываю контекстную сеть, возникла некоторая проблема.
Имеется такая база данных:
CREATE TABLE context (id MEDIUMINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
      uid MEDIUMINT UNSIGNED NOT NULL,
      title VARCHAR(30) NOT NULL,
      description VARCHAR(60) NOT NULL,
      url VARCHAR(250) NOT NULL,
      balance DECIMAL(8, 4) DEFAULT 0 NOT NULL,
      createdAt DATETIME DEFAULT NOW() NOT NULL
    );

И вторая нормализованная для проверок:
CREATE TABLE context_check (id MEDIUMINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
      task_id MEDIUMINT UNSIGNED NOT NULL,
      ip VARCHAR(15) NOT NULL,
      visited DATETIME DEFAULT NOW() NOT NULL
);

Когда кто-то переходит по контекстной ссылке, проверяется был ли переход в context_check основываясь на ip.
В php происходит выборка с базы данных:
$context = $DB->query("SELECT id, title, description FROM context WHERE balance >= 1 ORDER BY RAND() LIMIT 5")->fetchAll();

Но при такой выборке возникает проблема с фильтрацией ссылок которые пользователь уже посетил с его ip.

Короче говоря нужно выбрать 5 записей с базы context, кроме тех записей у которых ip = ip юзера и visited != null, но если записи в context_check вообще нет, то всё ровно выводить данные, такое не получается с inner join
  • Вопрос задан
  • 61 просмотр
Пригласить эксперта
Ответы на вопрос 1
@consiglierekz
Примерно так:
SELECT DISTINCT context.id, context.title, context.description
LEFT JOIN 
 (SELECT * FROM context_check WHERE context_check.ip = ':user_ip' AND context_check.visited IS NOT NULL) checks
ON ...
WHERE checks.id IS NULL
LIMIT 5


Подзапрос выбирает все проверки по ip, которые были для пользователя, далее мы мы берём только ссылки для которых не было проверок засчёт `LEFT JOIN` и `WHERE checks.id IS NULL`
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы