函数结果与查询结果不匹配

时间:2020-07-22 10:56:35

标签: php mysql

编辑:响应效果很好,但与我的解释不完全一样,我只想为每个函数返回1个结果,因此计算结果中有多少个奇数,并计算有多少个偶数结果如何?

SQL拨弄数据

http://sqlfiddle.com/#!9/dfbfa7/1

我试图通过使用2个函数拆分结果来计算偶数和奇数,但我的结果与mysql表中的结果不匹配。

数据

    Traceback (most recent call last):
  File "/home/giorgos/.local/share/virtualenvs/ev-loader-backend-tcqKXHeF/lib/python3.7/site-packages/django/core/handlers/exception.py", line 34, in inner
    response = get_response(request)
  File "/home/giorgos/.local/share/virtualenvs/ev-loader-backend-tcqKXHeF/lib/python3.7/site-packages/django/core/handlers/base.py", line 115, in _get_response
    response = self.process_exception_by_middleware(e, request)
  File "/home/giorgos/.local/share/virtualenvs/ev-loader-backend-tcqKXHeF/lib/python3.7/site-packages/django/core/handlers/base.py", line 113, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "/home/giorgos/.local/share/virtualenvs/ev-loader-backend-tcqKXHeF/lib/python3.7/site-packages/django/views/decorators/csrf.py", line 54, in wrapped_view
    return view_func(*args, **kwargs)
  File "/home/giorgos/.local/share/virtualenvs/ev-loader-backend-tcqKXHeF/lib/python3.7/site-packages/rest_framework/viewsets.py", line 114, in view
    return self.dispatch(request, *args, **kwargs)
  File "/home/giorgos/.local/share/virtualenvs/ev-loader-backend-tcqKXHeF/lib/python3.7/site-packages/rest_framework/views.py", line 505, in dispatch
    response = self.handle_exception(exc)
  File "/home/giorgos/.local/share/virtualenvs/ev-loader-backend-tcqKXHeF/lib/python3.7/site-packages/rest_framework/views.py", line 465, in handle_exception
    self.raise_uncaught_exception(exc)
  File "/home/giorgos/.local/share/virtualenvs/ev-loader-backend-tcqKXHeF/lib/python3.7/site-packages/rest_framework/views.py", line 476, in raise_uncaught_exception
    raise exc
  File "/home/giorgos/.local/share/virtualenvs/ev-loader-backend-tcqKXHeF/lib/python3.7/site-packages/rest_framework/views.py", line 502, in dispatch
    response = handler(request, *args, **kwargs)
  File "/home/giorgos/.local/share/virtualenvs/ev-loader-backend-tcqKXHeF/lib/python3.7/site-packages/rest_framework/mixins.py", line 19, in create
    self.perform_create(serializer)
  File "/home/giorgos/.local/share/virtualenvs/ev-loader-backend-tcqKXHeF/lib/python3.7/site-packages/rest_framework/mixins.py", line 24, in perform_create
    serializer.save()
  File "/home/giorgos/.local/share/virtualenvs/ev-loader-backend-tcqKXHeF/lib/python3.7/site-packages/rest_framework/serializers.py", line 212, in save
    self.instance = self.create(validated_data)
  File "/home/giorgos/Desktop/ev-loader-backend/stations/serializers.py", line 185, in create
    reservation = Reservation.objects.create(user=user.id, plug=plug.id, **validated_data)

Exception Type: AttributeError at /api/stations/reservations/
Exception Value: 'NoneType' object has no attribute 'id'

返回奇数计数的功能

select number from table group by number

results
1,4,6,7,8,9,11,12

和返回偶数计数的函数

SELECT   
 COUNT(CASE WHEN (number% 2) > 0 THEN number ELSE NULL END) as odd
 FROM test.table
 WHERE date = CURDATE() and time > now() - interval 60 second group by number
 LIMIT 1

我希望结果会

奇数= 4 偶数= 4

但是我得到了

奇数= 8 偶= 0

我要去哪里错了?

3 个答案:

答案 0 :(得分:1)

也许尝试这样的事情。

对于偶数:

COUNT(SELECT * FROM `table` WHERE mod(number, 2)=0);

对于奇数:

COUNT(SELECT * FROM `table` WHERE mod(number, 2)>0);

这将返回唯一的奇数和偶数,然后使用php收集这些数字。

答案 1 :(得分:1)

COUNT将累加它遍历的所有行

您必须使用SUM:

 SUM(CASE WHEN (number% 2) > 0 THEN 1 ELSE 0 END) as odd
 SUM(CASE WHEN (number% 2) = 0 THEN 1 ELSE 0 END) as even

对于简单的操作,IF比CASE干净得多:

 SUM(IF(number % 2 > 0, 1, 0)) as odd
 SUM(IF(number% 2 = 0, 1, 0)) as even

答案 2 :(得分:0)

您的查询返回错误结果的原因可能是因为您在使用limit 1时也尝试将其删除,如果必须使用group by,请使用group by number ,例如,我在这里更改了查询。

SELECT   
  count(CASE WHEN (a.number% 2) = 0 THEN a.number ELSE NULL END) as even,
  count(CASE WHEN (a.number% 2) <> 0 THEN a.number ELSE NULL END) as odd
FROM (select number from test group by number) a;

http://sqlfiddle.com/#!9/dfbfa7/22

对于您创建的结果即时获得5个偶数和5个奇数的设置,如果结果与实际数据不同,可能必须重新检查where子句中的条件。