MySql Left Join记录where null,处理validUntil Row

时间:2017-03-01 16:21:19

标签: mysql select left-join isnull

如何选择特定用户尚未购买或不再有效的所有插件? 假设currentdate是2017-03-02 17:00:00

表1(用户):

+-----------+----------+
| id        | username |
+-----------+----------+
| 1         | Walter   |
| 2         | Hank     |
| 3         | John     |
+-----------+----------+

表2(buyLog):

+-----------+----------+------------+---------------------+
| id        | idUsers  | idItems    | validUntil          |
+-----------+----------+------------+---------------------+
| 1         | 1        | 1          | 2016-03-02 14:15:47 |
| 2         | 1        | 1          | 2018-03-02 14:15:47 |
| 3         | 1        | 2          | 2016-03-02 14:15:47 |
| 4         | 2        | 1          | 2018-03-02 14:15:47 |
+-----------+----------+------------+---------------------+

表3(插件):

+-----------+----------+
| id        | name     |
+-----------+----------+
| 1         | Foo      |
| 2         | Bar      |
| 3         | Lorem    |
+-----------+----------+

ID为1的用户的预期输出应为:

+-----------+----------+
| id        | name     |
+-----------+----------+
| 2         | Bar      |
| 3         | Lorem    |
+-----------+----------+

请参阅SQL小提琴:http://sqlfiddle.com/#!9/16356

我遇到的问题最多的是处理leftJoin中的validUntil。 我想我必须在左连接期间分组才能仅使用最新的validUntil记录。也许使用max(validUntil)?

2 个答案:

答案 0 :(得分:1)

此代码可以使用

http://sqlfiddle.com/#!9/16356/1/0

SELECT
C.ID AS 'ID',
C.NAME AS 'NAME'
FROM
(SELECT 
 A.id AS 'ID',A.name AS 'NAME',
 CASE 
 WHEN B.YY > '2017-03-02 17:00:00' THEN 0
 ELSE 1 END AS 'Tag'
 FROM
 addons AS A
 LEFT JOIN
 (SELECT idItems AS 'XX', MAX(validUntil) AS 'YY' 
  FROM 
  buyLog
  WHERE idUsers = 1 GROUP BY 1) AS B
  ON 
  A.id = B.XX) AS C
  WHERE 
  C.Tag = 1

答案 1 :(得分:0)

我的感觉是,您的解释,数据集和期望的结果都不足以解释问题。以下查询产生了所需的结果,但也许这只是巧合...

SELECT a.* 
  FROM addons a
  LEFT
  JOIN buylog b
    ON b.iditems = a.id
   AND b.validuntil > NOW()
  LEFT
  JOIN users u
    ON u.id = b.idusers 
   AND u.id = 1
  WHERE b.validuntil IS NULL
    AND u.id IS NULL;