2014-11-02 197 views
0

我有以下查询,我正在使用这两个运算符来获取具有特定数字之间的年龄的记录,但查询花了很多时间来显示结果,其鸭舌超过5分钟仍运行查询花费很长时间执行

SELECT 
    *, 
    (SELECT COUNT(*) 
    FROM users 
    WHERE 
    1=1 OR 
    LOWER(age) BETWEEN 18 AND 20 OR 
    LOWER(age) BETWEEN 20 AND 25 OR 
    LOWER(age) BETWEEN 25 AND 30 OR 
    LOWER(age) BETWEEN 30 AND 35 
) AS totalcount 
FROM users, states, countries, user_types, media 
WHERE 
    users.id_user_type = user_types.id AND 
    users.id_state = states.id AND 
    users.id_country = countries.id AND 
    media.id_user = users.id AND 
    media.profile_photo = 1 AND 
    users.id_user_type = 3 OR 
    LOWER(age) BETWEEN 18 AND 20 OR 
    LOWER(age) BETWEEN 20 AND 25 OR 
    LOWER(age) BETWEEN 25 AND 30 OR 
    LOWER(age) BETWEEN 30 AND 35 
ORDER BY users.id 

令人不安的部分是:使用or条款你有(它没有意义)

LOWER(age) BETWEEN 18 AND 20 OR 
LOWER(age) BETWEEN 20 AND 25 OR 
LOWER(age) BETWEEN 25 AND 30 OR 
LOWER(age) BETWEEN 30 AND 35 
+0

你是什么试图用这个查询来检索? – 2014-11-02 12:57:24

+0

你怎么得出这样的结论:查询的那一部分是令人不安的部分? – Guffa 2014-11-02 12:57:29

回答

1

避免。你的查询可能做了很多CROSS JOIN操作,这就是为什么它需要很长时间(你的结果集很大)。

select *, 
     (
      select count(*) 
       from users 
      where 1=1 
       or lower(age) between 18 and 20 
       or lower(age) between 20 and 25 
       or lower(age) between 25 and 30 
       or lower(age) between 30 and 35 
     ) as totalcount 
    from users, states, countries, user_types, media 
    where users.id_user_type = user_types.id 
    and users.id_state = states.id 
    and users.id_country = countries.id 
    and media.id_user = users.id 
    and media.profile_photo = 1 
    and users.id_user_type = 3 
    order by users.id 

此外,目前还不清楚你试图用这个查询来完成什么。

回答这些问题可以帮助我们来帮您:

  1. 有什么age列类型
  2. 你到底是从内部查询
+2

WHERE 1 = 1'和所有其他'BETWEEN'语句怎么样?为什么使用LOWER年龄),年龄是一个字符串吗?为什么要把它和数字比较呢?我认为你应该解决这些问题,当它说“它没有意义”时。 – wolfgangwalther 2014-11-02 13:02:21

0

or语句解析不正确期待什么。您需要括号:

FROM users, states, countries, user_types, media 
WHERE (users.id_user_type = user_types.id AND 
     users.id_state = states.id AND 
     users.id_country = countries.id AND 
     media.id_user = users.id AND 
     media.profile_photo = 1 AND 
     (users.id_user_type = 3 OR 
     LOWER(age) BETWEEN 18 AND 20 OR 
     LOWER(age) BETWEEN 20 AND 25 OR 
     LOWER(age) BETWEEN 25 AND 30 OR 
     LOWER(age) BETWEEN 30 AND 35 
     ) 

书面,查询所要做的五个表中一个完整的笛卡尔乘积,然后做一些怪异的过滤。

如果您使用适当的join语法,这基本上是一个非问题。简单的规则:切勿在from子句中使用逗号。

另外,查询似乎没有意义。为什么要将age作为字符串存储(如使用lower()建议的那样?那么,为什么要将这些与整数进行比较?为什么要将连续范围分成四个不同的比较,而不是仅仅说age between 18 and 35