#mysql #select #count
#mysql #выберите #подсчет
Вопрос:
Я запутался, как получить некоторые данные из базы данных 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 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
Я хочу показать данные из COUNT(A.Serial_number) AS Qty
, которые имеют результат, подобный:
- Кол-во = 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 |
Комментарии:
1. пожалуйста, сообщите структуру вашей таблицы и их отношения
2. Вам нужно использовать
HAVING
(если я правильно понимаю вопрос).3. Еще один момент: вы уверены, что вам не нужно группировать по
A.NIK
тоже? Что происходит, когда некоторые строки (которые относятся к одной группе) таблицыinspection_report
имеют разныеNIK
значения? Как и сейчас, будет показан один из связанныхB.name
ов (более или менее случайным образом).4. @ypercube: нет, мне не нужно группировать по нику. Пока этого достаточно.
5. Если вы знаете, что все строки в группе имеют одинаковое значение
A.NIK
, тогда да, вам тоже не нужно.
Ответ №1:
После того, как вы выполните GROUP BY
, вы можете использовать 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
Лучше не использовать LIKE
с числовыми полями или вычисленными результатами. Это условие:
Qty LIKE '20' OR Qty LIKE '8' OR Qty LIKE '32'
может быть записано, когда Qty
является целым числом, как:
Qty = 20 OR Qty = 8 OR Qty = 32
или эквивалентно как:
Qty IN (20, 8, 32)
Ответ №2:
До сих пор я пробовал самостоятельно использовать 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'
После этого я получаю то, что хочу.
ИЛИ USE HAVING
(самый простой способ).