2015-10-07 2 views
0

MySQL таблицы:SQL строки сумма столбца с пробелами между числами

table_results:

id results 

1 1 0 1 2 4 5 
2 5 4 2 6 
3 7 2 8 2 4 

Я создаю GridView Yii Мне нужно

SELECT SUM(results) AS results2 FROM table_results WHERE id = 1: 

, например, я должен подвести первая строка: 1 + 0 + 1 + 2 + 4 + 5 и сделать в качестве результатов2, которые = 15.

Как это сделать только в sql?

+2

Никогда не храните данные в виде пространства/разделенных запятыми элементов в столбце, вы получите так много проблем ... Одна строка/значение является SQL путь! – jarlh

+0

* Как это сделать только в sql? * <- с большим количеством проблем – Lamak

+0

Когда вы создаете результаты, сгенерируйте сумму. И, как отдельная колонка. Казалось бы, это самый надежный подход. –

ответ

1

Один из способов сделать это - использовать динамический SQL. Таким образом, полностью в MySQL:

declare @sql varchar(2000); 

select @sql = concat('select ', replace(results, ' ', '+')) 
from table_results tr 
where id = 1; 

prepare s from @sql; 
execute s; 

deallocate prepare s; 

Как примечание: Только потому, что я ответил на вопрос, не означает, что я оправдываю структуру данных.

+0

Я запускаю ваш код http://sqlfiddle.com/#!2/e756a/1/3 и для одной строки это нормально. Но для нескольких строк я получу несколько результирующих наборов http://sqlfiddle.com/#!9/c7a372/1 – lad2025

+0

@ lad2025. , , Речь идет только о суммировании значений в одной строке: «Мне нужно суммировать первую строку». –

+0

Я немного расширяю вашу идею, чтобы работать для всех строк: http://sqlfiddle.com/#!9/c7a372/14/4 Завтра буду завтракать, потому что я использовал все свои голоса;) – lad2025

2

Нет необходимости в динамическом SQL. Вы можете использовать:

SqlFiddleDemo

SELECT sub.id, SUM(sub.val) AS `sum` 
FROM 
(
    SELECT id, SUBSTRING_INDEX(SUBSTRING_INDEX(t.results, ' ', n.n), ' ', -1) AS val 
    FROM table_results t 
    CROSS JOIN 
    (
    SELECT a.N + b.N * 10 + 1 n 
     FROM 
     (SELECT 0 AS N UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) a 
    ,(SELECT 0 AS N UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) b 
) n 
    WHERE n.n <= 1 + (LENGTH(t.results) - LENGTH(REPLACE(t.results, ' ', ''))) 
) sub 
-- WHERE sub.id = 1 
GROUP BY sub.id 
+0

@GordonLinoff Хорошая точка – lad2025

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