在子查询或连接中使用id的MYSQL查询

时间:2015-05-20 19:14:47

标签: mysql sql join

我正在尝试根据28天,6周和13周的周期获得用户的最早审核日期,当执行6周评论时,还会在28天表中进行输入(有效地重置它),以及当13周评论时在28天和6周的表格中都会输入一个条目。

当我指定特定用户时,这一切都正常,但我想在user表上执行选择,并为每个用户计算并附加到行的末尾。

违规行是这样的

WHERE `user_review_28_user_id` = '6'

提供用户列表,但只填充匹配的用户,在这种情况下填充user_id=6

我想做的是

WHERE `user_review_28_user_id` = `user_id`

但是user_id没有传播到子查询,因此我得到user_review_next字段和user_review_next_type的'NULL'条目。

我尝试过的事情包括JOIN和VARIABLES,例如,

SELECT *, @user_id:=user_id
FROM `user`

并用此

替换有问题的WHERE
WHERE `user_review_28_user_id` = @user_id

这是我的查询,经过几个小时,现在它正在阻止我:(

SELECT `user_id`, `user_first`, `user_last`, `user_review_next`, `user_review_next_type`
FROM `user`
LEFT JOIN (
SELECT *
FROM
(
    SELECT `user_review_28_user_id` as user_review_id, DATE_ADD(`user_review_28_date`, INTERVAL 28 DAY) AS 'user_review_next', '1' AS 'user_review_next_type'
    FROM `user_review_28`
    WHERE `user_review_28_user_id` = '6'
    UNION
    SELECT `user_id` as user_review_id, DATE_ADD(`user_start_date`, INTERVAL 28 DAY) AS 'user_review_next', '1' AS 'user_review_next_type'
    FROM `user`
    WHERE `user_id` = '6'
    ORDER BY `user_review_next` DESC
    LIMIT 1
) AS tmp_28d
UNION
SELECT * 
FROM
(
    SELECT `user_review_6_user_id` as user_review_id, DATE_ADD(`user_review_6_date`, INTERVAL 6 WEEK) AS 'user_review_next', '2' AS 'user_review_next_type'
    FROM `user_review_6`
    WHERE `user_review_6_user_id` = '6'
    UNION
    SELECT `user_id` as user_review_id, DATE_ADD(`user_start_date`, INTERVAL 6 WEEK) AS 'user_review_next', '2' AS 'user_review_next_type'
    FROM `user`
    WHERE `user_id` = '6'
    ORDER BY `user_review_next` DESC
    LIMIT 1
) AS tmp_6w
UNION
SELECT * 
FROM
(
    SELECT `user_review_13_user_id` as user_review_id, DATE_ADD(`user_review_13_date`, INTERVAL 13 WEEK) AS 'user_review_next', '3' AS 'user_review_next_type'
    FROM `user_review_13`
    WHERE `user_review_13_user_id` = '6'
    UNION
    SELECT `user_id` as user_review_id, DATE_ADD(`user_start_date`, INTERVAL 13 WEEK) AS 'user_review_next', '3' AS 'user_review_next_type'
    FROM `user`
    WHERE `user_id` = '6'
    ORDER BY `user_review_next` DESC
    LIMIT 1
) AS tmp_13w
ORDER BY user_review_next ASC, user_review_next_type DESC
LIMIT 1
) AS tmp_user_review
ON user.user_id = tmp_user_review.user_review_id

这是查询的示例输出,如上所示。

1   David   Berry       NULL        NULL
2   Joseph  Armstrong   NULL        NULL
3   Thomas  Brown       NULL        NULL
4   Paul    Armstrong   NULL        NULL
5   Calum   Blair       NULL        NULL
6   Craig   Bridges     2015-05-27  1
7   Donald  Branscombe  NULL        NULL
8   Kenneth Bacon       NULL        NULL
9   Jason   Bambrick    NULL        NULL

SQLFiddle

2 个答案:

答案 0 :(得分:2)

你试过这个吗?

SELECT `user_id`, `user_first`, `user_last`, `user_review_next`, `user_review_next_type`
FROM `user`
LEFT JOIN (
SELECT *
FROM
(
    SELECT `user_review_28_user_id` as user_review_id, DATE_ADD(`user_review_28_date`, INTERVAL 28 DAY) AS 'user_review_next', '1' AS 'user_review_next_type'
    FROM `user_review_28`
    UNION
    SELECT `user_id` as user_review_id, DATE_ADD(`user_start_date`, INTERVAL 28 DAY) AS 'user_review_next', '1' AS 'user_review_next_type'
    FROM `user`
    WHERE `user_id` = '6'
    ORDER BY `user_review_next` DESC
    LIMIT 1
) AS tmp_28d
UNION
SELECT * 
FROM
(
    SELECT `user_review_6_user_id` as user_review_id, DATE_ADD(`user_review_6_date`, INTERVAL 6 WEEK) AS 'user_review_next', '2' AS 'user_review_next_type'
    FROM `user_review_6`
    UNION
    SELECT `user_id` as user_review_id, DATE_ADD(`user_start_date`, INTERVAL 6 WEEK) AS 'user_review_next', '2' AS 'user_review_next_type'
    FROM `user`
    WHERE `user_id` = '6'
    ORDER BY `user_review_next` DESC
    LIMIT 1
) AS tmp_6w
UNION
SELECT * 
FROM
(
    SELECT `user_review_13_user_id` as user_review_id, DATE_ADD(`user_review_13_date`, INTERVAL 13 WEEK) AS 'user_review_next', '3' AS 'user_review_next_type'
    FROM `user_review_13`
    UNION
    SELECT `user_id` as user_review_id, DATE_ADD(`user_start_date`, INTERVAL 13 WEEK) AS 'user_review_next', '3' AS 'user_review_next_type'
    FROM `user`
    WHERE `user_id` = '6'
    ORDER BY `user_review_next` DESC
    LIMIT 1
) AS tmp_13w
ORDER BY user_review_next ASC, user_review_next_type DESC
LIMIT 1
) AS tmp_user_review
ON user.user_id = tmp_user_review.user_review_id
WHERE tmp_user_review= '6'

答案 1 :(得分:0)

这就是我想出来的,但现在我收到了错误

#1104 - The SELECT would examine more than MAX_JOIN_SIZE rows; check your WHERE and use SET SQL_BIG_SELECTS=1 or SET MAX_JOIN_SIZE=# if the SELECT is okay

除非我在查询之前包含行SET SQL_BIG_SELECTS=1;,否则我希望有人仍会跳进来帮助我解决我的SQL问题

SELECT `user_id`,
`user_first`,
    `user_last`,
    LEAST
    (
        DATE_ADD(user_review_28_date, INTERVAL 28 DAY),
            DATE_ADD(user_review_6_date, INTERVAL 6 WEEK),
            DATE_ADD(user_review_13_date, INTERVAL 13 WEEK)
    ) AS user_review_next_date,
    CASE
       WHEN LEAST
        (
                DATE_ADD(user_review_28_date, INTERVAL 28 DAY),
                DATE_ADD(user_review_6_date, INTERVAL 6 WEEK),
                DATE_ADD(user_review_13_date, INTERVAL 13 WEEK)
        ) = DATE_ADD(user_review_28_date, INTERVAL 28 DAY) THEN '1'
        WHEN LEAST
        (
                DATE_ADD(user_review_28_date, INTERVAL 28 DAY),
                DATE_ADD(user_review_6_date, INTERVAL 6 WEEK),
                DATE_ADD(user_review_13_date, INTERVAL 13 WEEK)
        ) = DATE_ADD(user_review_6_date, INTERVAL 6 WEEK) THEN '2'
        WHEN LEAST
        (
                DATE_ADD(user_review_28_date, INTERVAL 28 DAY),
                DATE_ADD(user_review_6_date, INTERVAL 6 WEEK),
                DATE_ADD(user_review_13_date, INTERVAL 13 WEEK)
        ) = DATE_ADD(user_review_13_date, INTERVAL 13 WEEK) THEN '3'
    END AS user_review_next_type
FROM `user` AS a
LEFT JOIN
(
SELECT user_review_28_user_id, user_review_28_date
    FROM `user_review_28`) AS b_28
ON a.user_id = b_28.user_review_28_user_id
        AND b_28.user_review_28_date=(SELECT MAX(user_review_28_date)
    FROM `user_review_28` AS c_28
    WHERE a.user_id = c_28.user_review_28_user_id
)
LEFT JOIN
(
SELECT user_review_6_user_id, user_review_6_date
    FROM `user_review_6`) AS b_6
ON a.user_id = b_6.user_review_6_user_id
        AND b_6.user_review_6_date=(SELECT MAX(user_review_6_date)
    FROM `user_review_6` AS c_6
    WHERE a.user_id = c_6.user_review_6_user_id
)
LEFT JOIN
(
SELECT user_review_13_user_id, user_review_13_date
    FROM `user_review_13`) AS b_13
ON a.user_id = b_13.user_review_13_user_id
        AND b_13.user_review_13_date=(SELECT MAX(user_review_13_date)
    FROM `user_review_13` AS c_13
    WHERE a.user_id = c_13.user_review_13_user_id
)

WHERE a.user_assessor_id ='5'
ORDER BY user_review_next_date ASC, user_review_next_type DESC