Как выбрать данные, сравнив имена двух элементов и их даты в запросе SQL - PullRequest
0 голосов
/ 08 октября 2018

Поэтому я пытаюсь получить элемент «Мне нравится» из таблицы, только если дата более поздняя, ​​чем элемент «Мне не нравится» с тем же идентификатором пользователя.Иногда это может быть только «Мне нравится», и тогда это тоже всегда нужно выбирать.

Это то, что у меня пока работает:

$query = "
SELECT * 
  FROM useractions 
 WHERE userid = '$userID' 
   AND (action= 'Like' OR action='Dislike')
 ";

Там я получаю все подобное/ Не нравится из того же идентификатора пользователя.Теперь мне просто нужно сравнить его с «date», чтобы увидеть, является ли «Like» более поздней датой, чем «Dislike», и если это так, выберите его, а также убедитесь, что like / dislike работает над тем же объектом.

То, что я писал (без его работы, очевидно), является дополнительным AND к моему запросу.

AND (action='Like' date > action='Dislike' date)" 

(дата - это еще один элемент в моей таблице с датой).

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

Ответы [ 2 ]

0 голосов
/ 08 октября 2018

Просто используйте not exists:

SELECT ua.*
FROM useractions ua
WHERE ua.userid = '$userID' AND ua.action ='Like' AND
      NOT EXISTS (SELECT 1
                  FROM useractions ua2
                  WHERE ua2.userid = ua.userid AND
                        ua2.action = 'dislike' AND
                        ua2.date > ua.date
                );

Для производительности вам нужен индекс на useractions(userid, action, date).

Для того же объекта вы просто сделаете:

SELECT ua.*
FROM useractions ua
WHERE ua.userid = '$userID' AND ua.action ='Like' AND
      NOT EXISTS (SELECT 1
                  FROM useractions ua2
                  WHERE ua2.userid = ua.userid AND
                        ua2.objectid = ua.objectid AND
                        ua2.action = 'dislike' AND
                        ua2.date > ua.date
                );
0 голосов
/ 08 октября 2018

Вы можете использовать объединение между двумя подзапросами

    select t1.* from  
    (
    select * 
    FROM useractions 
    WHERE userid = '$userID'   
    AND action= 'Like' 
    ) t1 
    inner join  (
    select * 
    FROM useractions 
    WHERE userid = '$userID'   
    AND action='Dislike'
    ) t2 ON t1.userid = t2.userid and t1.date > t2.date 
    where t1.userid = '$userID' 

, в любом случае вам не следует использовать php var в sql. Посмотрите на драйвер php mysql для подготовленного оператора и параметра связывания

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...