2013-12-23 3 views
1

Привет, парень Я работаю над POS-приложением с MySQL. Вот моя ситуация:POS-приложение - упростить SQL Mutli-Queries (MySQL)

Таблица «purchased_item»

| id | name | check_id | real_price | 
| 1  | iPhone5 |  0001  |  399  | 
| 2  | iPhone4 |  0001  |  199  | 
| 3  | iPhone5s |  0002  |  599  | 
| 4  | iPhone5c |  0003  |  399  | 
| 5  | iMac 21" |  0003  |  999  | 
| 6  | iPod Touch |  0003  |  99  | 
| 7  | iPhone5 |  0004  |  399  | 
| 8  | iPhone3G |  0004  |  99  | 
| 9  | iPhone6 |  0005  |  899  | 
| 10 | iPhone3Gs |  0005  |  101  | 

И я хочу знать, сколько проверок Тотал больше или каче (> =) 1000, так что я делаю сейчас, чтобы сделать несколько раз запроса. В этом примере я делаю 5 раз и суммирую его вручную с помощью хост-программы.

Позже данные растут, запросы становятся медленными, потому что каждый день проверяется тонна чеков. Поэтому я переписываю его на другую таблицу.

стол «проверяет»

| id | total | sales | 
| 0001 |  598  |  A  | 
| 0002 |  599  |  A  | 
| 0003 |  1497 |  B  | 
| 0004 |  498  |  B  | 
| 0005 |  1000 |  A  | 

Но другая проблема происходит в более позднее время: Когда мне нужно настроить real_price в таблице «purchased_item», я также должен поддерживать столбец «тотальную» в «сдержек " Таблица. Это звучит неважно, но я бы хотел найти лучший способ решить эту проблему.

Решено:

SELECT * FROM purchased_item 
GROUP BY check_id 
HAVING sum(real_price) >= 1000 

И результат будет:

| id | name | check_id | real_price | 
| 4  | iPhone5c |  0003  |  399  | 
| 9  | iPhone6 |  0005  |  899  | 

Еще один вопрос: Если я хочу, чтобы подсчитать общую цену для проверки, как я могу это сделать? я нашел:

SELECT check_id,sum(real_price) FROM purchased_item 
GROUP BY check_id 
HAVING sum(real_price) >= 1000 
+0

Но check_id 0003 применяется для iphone5c, IMAC 21 и IPod Touch. И check_id 0005 применяется для iphone6 ​​и iphone3gs.(0003 и 0005 превышают 1000) – MrSimpleMind

+0

Если вам нужна игрушка show 'check_id' с суммой' real_price' больше 100, почему вы показываете только 'iPhone5c', а не' iPhone3Gs', поскольку она является частью 'check_id' 0005 ? – gotqn

+0

bcoz Я хочу удалить дублируемую запись, или, я должен сказать, хочу подсчитать, сколько проверок превышает 1000 –

ответ

0

Попробуйте это так

SELECT i.id, i.name, i.check_id, i.real_price 
    FROM 
(
    SELECT MIN(id) id 
    FROM purchased_item 
    GROUP BY check_id 
    HAVING SUM(real_price) >= 1000 
) q JOIN purchased_item i 
    ON q.id = i.id 
ORDER BY q.id DESC 

Пример вывода:

 
| ID |  NAME | CHECK_ID | REAL_PRICE | 
|----|----------|----------|------------| 
| 9 | iPhone6 |  5 |  899 | 
| 4 | iPhone5c |  3 |  399 | 

... Я хочу, чтобы подсчитать, сколько проверок Тотал более 1000

Для этого вы можете просто сделать этот вывод

SELECT COUNT(*) total 
    FROM 
(
    SELECT check_id 
    FROM purchased_item 
    GROUP BY check_id 
    HAVING SUM(real_price) >= 1000 
) q; 

Пример:

 
| TOTAL | 
|-------| 
|  2 | 

Здесь SQLFiddle демо


Чтобы обновить total в checks после корректировки real_price в purchased_item

UPDATE checks c JOIN 
(
    SELECT check_id, SUM(real_price) total 
    FROM purchased_item 
    WHERE check_id IN(5) -- whatever check(s)'s total you want to recalculate 
    GROUP BY check_id 
) p 
    ON c.id = p.check_id 
    SET c.total = p.total; 

Вот SQLFiddle демо

+0

GROUP BY - простейшее решение. Благодаря! –

Смежные вопросы