将值传递给Subselect

时间:2014-09-24 17:35:35

标签: mysql sql

        SELECT
            u.*,
            GROUP_CONCAT(DISTINCT f.shot_id SEPARATOR ",") AS ownFavorites,
            GROUP_CONCAT(DISTINCT st.shot_id SEPARATOR ",") AS ownStars,
            GROUP_CONCAT(DISTINCT s.id SEPARATOR ",") AS ownShots,
            ( SELECT AVG(p.count)
                FROM points p
                LEFT JOIN shots s ON s.user_id = **U.ID** AND p.shot_id = s.id
                WHERE date >= DATE_SUB(CURDATE(),INTERVAL 2 DAY)
            ) AS attention,
            ( SELECT SUM(p.count)
                FROM points p
                LEFT JOIN shots s ON s.user_id = **U.ID** AND s.id = p.shot_id
            ) AS popularity
        FROM users u
        LEFT OUTER JOIN shots s ON s.user_id = u.id
        LEFT OUTER JOIN favorites f ON f.user_id = u.id
        LEFT OUTER JOIN stars st ON st.user_id = u.id
        WHERE u.username = ?;

我有两个使用参数u.id的子选择(在查询中标记)。如果我像这样执行sql,它会产生类似的东西:

#1054 - Unknown column 'u.id' in 'on clause'

表示u.id中没有定义SubSelects ID。但在MainSelect我选择的users表中,u.id存在。

回答我的问题:有没有办法将选定的u.id值传递给Subselects和普通的sql?

3 个答案:

答案 0 :(得分:2)

不要忘记子查询中的GROUP BY:

SELECT
    u.*,
    COALECSE(a.average, 0) attention,
    COALESCE(p.total, 0) popular,
    GROUP_CONCAT(DISTINCT f.shot_id) AS ownFavorites,
    GROUP_CONCAT(DISTINCT st.shot_id SEPARATOR ",") AS ownStars,
    GROUP_CONCAT(DISTINCT s.id SEPARATOR ",") AS ownShots
FROM
    users u
LEFT JOIN
    (
    SELECT
        s.user_id,
        AVG(p.count) average
    FROM
        shots s
    JOIN
        points p
        ON s.id = p.shot_id
    WHERE
        s.date >+ CURRENT_DATE - INTERVAL 2 DAY
    GROUP BY s.user_id
    ) a
    ON u.id = a.user_id
LEFT JOIN
    (
    SELECT
        s.user_id,
        SUM(p.count) total
    FROM
        shots s
    JOIN
        points p
        ON s.id = p.shot_id
    GROUP BY s.user_id
    ) p
    ON u.id = p.user_id
LEFT OUTER JOIN shots s ON s.user_id = u.id
LEFT OUTER JOIN favorites f ON f.user_id = u.id
LEFT OUTER JOIN stars st ON st.user_id = u.id
WHERE u.username = 'user'

答案 1 :(得分:1)

尝试将选择转换为子选择连接。

FROM users u
LEFT OUTER JOIN shots s ON s.user_id = u.id
LEFT OUTER JOIN favorites f ON f.user_id = u.id
LEFT OUTER JOIN stars st ON st.user_id = u.id
LEFT OUTER JOIN ( SELECT AVG(p.count) AverageOfP, p.shot_id
            FROM points p             
            WHERE date >= DATE_SUB(CURDATE(),INTERVAL 2 DAY)
        ) p ON p.shot_id = s.id
LEFT OUTER JOIN ( SELECT SUM(p.count) SumOfP, p.shot_id
            FROM points p             
        ) p2 ON p2.shot_id = s.id

s表已经加入你了,应该是好的。然后在您的选择中,您只需选择AverageOfP和SumOfP。

答案 2 :(得分:1)

似乎这样可行。 select没有按照您的方式了解users表。我相信这会有用户的知识。

    SELECT
        u.*,
        GROUP_CONCAT(DISTINCT f.shot_id SEPARATOR ",") AS ownFavorites,
        GROUP_CONCAT(DISTINCT st.shot_id SEPARATOR ",") AS ownStars,
        GROUP_CONCAT(DISTINCT s.id SEPARATOR ",") AS ownShots,
        A.Attention, P.Popularity
      FROM users u
    LEFT OUTER JOIN shots s ON s.user_id = u.id
    LEFT OUTER JOIN favorites f ON f.user_id = u.id
    LEFT OUTER JOIN stars st ON st.user_id = u.id
    LEFT OUTER JOIN 
      ( SELECT AVG(p.count) attention
            FROM points p
            LEFT JOIN shots s ON s.user_id = **U.ID** AND p.shot_id = s.id
            WHERE date >= DATE_SUB(CURDATE(),INTERVAL 2 DAY)
        ) AS A,
        ( SELECT SUM(p.count) popularity
            FROM points p
            LEFT JOIN shots s ON s.user_id = **U.ID** AND s.id = p.shot_id
        ) AS P
    WHERE u.username = ?;