Mysql:选择指定点之间的所有数据

Posted

技术标签:

【中文标题】Mysql:选择指定点之间的所有数据【英文标题】:Mysql: Select all data between specified points 【发布时间】:2014-09-20 06:31:31 【问题描述】:

我有一个 mysql 表,其中的数据连接到点。像这样:

tbl_user

tbl_earned_points

tbl_used_points

我有一个选择可用点数据的 mysql 查询。这是查询:

SELECT
user.user_email_id AS userEmailId,
IFNULL(SUM(earn_points.earned_points),0) AS lifeTimePoints,
IFNULL((SUM(earn_points.earned_points) - (SELECT IFNULL(SUM(used_points.points_used),0) FROM tbl_used_points AS used_points WHERE used_points.user_id=earn_points.user_id)),0) AS availablePoints
FROM tbl_earned_points AS earn_points
RIGHT JOIN tbl_user AS user ON earn_points.user_id=user.user_id WHERE user.user_email_id <> '' AND user.user_email_id <> '0'
GROUP BY user.user_email_id
ORDER BY availablePoints ASC

从上面的查询中,我收到了所有的电子邮件和类似的结果

userEmailId              lifeTimePoints     availablePoints
samal07@gmail.com        1745               1500
mistyorr_20@yahoo.com    100                75
bsfar@yahoo.com          85                 85
tgray@gmail.com          94                 90
lori_bag@yahoo.com       547                450

我的问题是我只需要获得 80 到 99 之间之间的可用点行。

所以我的查询结果会像

 userEmailId        lifeTimePoints      availablePoints
 bsfar@yahoo.com        85              85
 tgray@gmail.com        94              90

【问题讨论】:

【参考方案1】:

只需将其添加到您的 WHERE 子句中:

AND availablePoints BETWEEN 80 AND 99

【讨论】:

#1054 - 'where 子句'中的未知列'availablePoints'【参考方案2】:

您可以将BETWEEN 子句用于availablePoints。随意设置availablePoints

【讨论】:

如果我在 where 子句中添加“AND availablePoints BETWEEN 80 AND 99”,那么它会给出 #1054 - 'where 子句'中的未知列 'availablePoints'【参考方案3】:

基本上你只需要添加WHERE 条件。但是,您也可以重写查询以删除相关的子查询,然后使用 OUTER JOINs

SELECT  u.user_email,
    COALESCE(e.points,0) lifeTimePoints,
    COALESCE(a.points,0) availablePoints
FROM tbl_user AS u
    LEFT JOIN (
        SELECT SUM(earned_points) points, user_id
        FROM tbl_earned_points
        GROUP BY user_id
    ) e ON u.user_id = e.user_id
    LEFT JOIN (
        SELECT SUM(points_used) points, user_id
        FROM tbl_used_points 
        GROUP BY user_id
    ) a ON u.user_id = a.user_id
WHERE a.points between 80 and 99

如果您希望使用现有查询,则需要将其包装在子查询中并使用列别名 (availablepoints),或者需要使用整个 IFNULL 语句你的WHERE 标准。 您不能直接引用列别名。

【讨论】:

使用 OUTER JOINS 的结果不正确 \n SELECT user_id FROM ( SELECT user_id, SUM(earned_points) as points FROM tbl_earned_points WHERE 1 GROUP BY user_id ) 作为总结 WHERE points BETWEEN 80 AND 99 from above query我得到 1761 行,从你的查询中我只得到 25 行 @user2046091 -- 它不应该返回相同的结果,它应该只返回 80 到 99 之间的可用点。但是,如果你在没有 WHERE 标准的情况下运行它,那么它应该返回相同数量的结果。

以上是关于Mysql:选择指定点之间的所有数据的主要内容,如果未能解决你的问题,请参考以下文章

my09_mysql指定时间点恢复

MySQL 集群备份1-功能点阐述

MySQL之指定过滤条件(HAVING)

mysql 截取指定位置后面的所有的字符

mysql存储过程实现 定时删除指定表中指定时间点的数据

MySQL中INSERT,UPDATE和REPLACE的区别与用法