Mysql:如何检索基于数据的COUNT()结果
我搞不清楚如何从MySQL数据库中检索一些数据。我有这样的疑问:Mysql:如何检索基于数据的COUNT()结果,mysql,select,count,Mysql,Select,Count,我搞不清楚如何从MySQL数据库中检索一些数据。我有这样的疑问: inspection_report table: - Inspection_datetime - Line - Model - Lot_no - Serial_number - Shift - Range_sampling - Accesories - Acc_qty Employee table: - NIK - name SELECT DATE(A.Inspection_datetime) AS Dat
inspection_report table:
- Inspection_datetime
- Line
- Model
- Lot_no
- Serial_number
- Shift
- Range_sampling
- Accesories
- Acc_qty
Employee table:
- NIK
- name
SELECT DATE(A.Inspection_datetime) AS Date, A.Line,TRIM(A.Model) AS Model, A.Lot_no,
COUNT(A.Serial_number) AS Qty,GROUP_CONCAT(DISTINCT(A.Shift)) AS Shift,
IF(RIGHT(A.Range_sampling,4)='0000',10000,RIGHT(A.Range_sampling,4))-MID(A.Range_sampling,5,4)+1 AS Merchandise,
A.Accesories,A.Acc_qty,A.Range_sampling,B.name
FROM inspection_report A
LEFT JOIN Employee B
ON A.NIK=B.NIK
WHERE CHAR_LENGTH(A.Range_sampling) = 17 AND A.Issue='' AND A.Check='' AND A.Approve=''
GROUP BY A.Line, A.Model, A.Lot_no, A.Range_sampling
ORDER BY Date DESC,A.Line
我想将计数(序列号)中的数据显示为数量,其结果如下:
|Date |Line |Model |Lot_no| Qty|Shift|Merchandise|Accesories|Acc_qty|Range_sampling|name |
+----------+-------+------+------+----+-----+-----------+----------+-------+--------------+-----+
|2011-05-12| fa 02 |BlaBla|021A | 20 | A | 200 | OK |11 | 1-200 |tom |
|2011-05-12| fa 15 | foo |021A | 8 | A | 200 | OK |11 | 1-200 |Bill |
|2011-05-12| fa 01 | Boom |021A | 32 | A | 200 | OK |11 | 1-200 | Jim |
- 数量=20
- 数量=8
- 数量=32
结果如下:
|Date |Line |Model |Lot_no| Qty|Shift|Merchandise|Accesories|Acc_qty|Range_sampling|name |
+----------+-------+------+------+----+-----+-----------+----------+-------+--------------+-----+
|2011-05-12| fa 02 |BlaBla|021A | 20 | A | 200 | OK |11 | 1-200 |tom |
|2011-05-12| fa 15 | foo |021A | 8 | A | 200 | OK |11 | 1-200 |Bill |
|2011-05-12| fa 01 | Boom |021A | 32 | A | 200 | OK |11 | 1-200 | Jim |
到目前为止,我已经试过自己使用
SELECT-inside-SELECT
:
SELECT X.Date,X.Line,X.Model,X.Qty,...........
FROM(
SELECT DATE(A.Inspection_datetime) AS Date, A.Line,TRIM(A.Model) AS Model, A.Lot_no,
COUNT(A.Serial_number) AS Qty,GROUP_CONCAT(DISTINCT(A.Shift)) AS Shift,
IF(RIGHT(A.Range_sampling,4)='0000',10000,RIGHT(A.Range_sampling,4))-MID(A.Range_sampling,5,4)+1 AS Merchandise,
A.Accesories,A.Acc_qty,A.Range_sampling,B.name
FROM inspection_report A
LEFT JOIN Employee B
ON A.NIK=B.NIK
WHERE CHAR_LENGTH(A.Range_sampling) = 17
AND A.Issue='' AND A.Check='' AND A.Approve=''
GROUP BY A.Line, A.Model, A.Lot_no, A.Range_sampling
ORDER BY Date DESC,A.Line) X
WHERE X.Qty LIKE '20' OR X.Qty LIKE '8' OR X.Qty LIKE '32'
在那之后,我得到了我想要的。
或者
使用HAVING
(最简单的方法)。在执行分组操作后,您可以使用HAVING
设置要保留聚合数据的条件:
SELECT DATE(A.Inspection_datetime) AS Date
, A.Line
, TRIM(A.Model) AS Model
, A.Lot_no
, COUNT(A.Serial_number) AS Qty
, GROUP_CONCAT(DISTINCT(A.Shift)) AS Shift
, IF( RIGHT(A.Range_sampling,4)='0000'
, 10000
, RIGHT(A.Range_sampling,4)
)
- MID( A.Range_sampling, 5, 4)
+ 1
AS Merchandise
, A.Accesories
, A.Acc_qty
, A.Range_sampling
, B.name
FROM inspection_report A
LEFT JOIN Employee B
ON A.NIK=B.NIK
WHERE CHAR_LENGTH(A.Range_sampling) = 17
AND A.Issue=''
AND A.Check=''
AND A.Approve=''
GROUP BY A.Line
, A.Model
, A.Lot_no
, A.Range_sampling
HAVING COUNT(A.Serial_number) IN (20, 8, 32)
ORDER BY Date DESC
, A.Line
最好不要像
那样使用数值字段或计算结果。这种情况:
Qty LIKE '20' OR Qty LIKE '8' OR Qty LIKE '32'
当数量
为整数时可以写入:
Qty = 20 OR Qty = 8 OR Qty = 32
或相当于:
Qty IN (20, 8, 32)
请告诉您的表结构及其关系您需要使用
HAVING
(如果我正确理解这个问题)。另一件事:您确定不需要也按A.NIK
分组吗?当表检验报告
的某些行(属于同一组)具有不同的NIK
时会发生什么情况?按照现在的方式,将显示一个相关的B.name
s(或多或少是随机的)。@ypercube:不,我不需要按NIK分组。在这里之前,这就足够了。如果您知道组中的所有行都有相同的a.NIK
,那么是的,您不需要太多。