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

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

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

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

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

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

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

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

0
Carlos Rodrigez 8 Окт 2018 в 19:32

2 ответа

Лучший ответ

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

    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 для подготовленного оператора и параметра привязки

1
scaisEdge 8 Окт 2018 в 16:41

Просто используйте 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
Gordon Linoff 8 Окт 2018 в 21:16