2017-03-01 76 views
1

如何选择特定用户尚未购买的所有插件或是不再有效? 假设的currentdate是2017年3月2日十七时00分00秒MySql Left加入记录,其中为null,处理validUntil Row

表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

在那里我有最多的问题是处理validUntil在leftJoin。 我想我必须在左连接期间进行分组才能踩到最近的validUntil记录。也许使用max(validUntil)?

+0

参见:http://sqlfiddle.com/#!9/16356 – Deltahost

回答

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 
+0

'左将C ...其中c ... = ...'与'inner join c'相同 – Strawberry

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;