2015-06-15 3 views
2

У меня есть небольшая база данных MySQL для онлайн-бронирования. Теперь я хотел получить некоторые данные из этого календаря. Я добавляю к каждой записи в календарных значениях (полностью оплаченный, частично оплаченный и статус (оплаченный, неоплаченный, зарезервированный и т. Д.)).PHP MySQL запрос (сумма из разных строк)

Я добавил изображение скриншота. Как вы можете видеть, есть 4 разных custom_attribute_id s. ID 1 сохраняет статус, ID 2 - полную цену и ID 3 - уже оплаченную цену. Столбец entity_id сохраняет его вместе. Так, например, все 4 записи с entity_id 232 принадлежат вместе.

Теперь я должен отображать следующее: 1. Сумма всех полных цен (так custom_attribute_id 2). Это я сделал с этим кодом:

$result = mysql_query('SELECT SUM(attribute_value) AS value_sum 
FROM custom_attribute_values WHERE custom_attribute_id=2'); 
$row = mysql_fetch_assoc($result); 
$sum = $row['value_sum']; 

Это работает и показывает мне сумму всех полных цен вводится в каландр.

С таким же кодом я также показываю сумму уже частично оплаченных сумм.

Но теперь проблема, я хочу показать сумму атрибута_value в зависимости от состояния. Таким образом, код должен суммировать все значения, когда custom_attribute_id = 2 И атрибут_значение соответствующего объекта entity_id является «Reserviert».

Было бы очень приятно, если бы кто-нибудь мог мне помочь или, по крайней мере, сообщить мне, если это возможно. Я не могу перепроектировать базу данных, так как этот код предоставляется из системы календаря.

Здесь дб как текст:

ID custom_attribute_value_id attribute_value entity_id attribute_category 
1124 1 Anfrage 233 1 
1125 2 1188 233 1 
1126 4 233 1 
1127 3 015757817858 233 1 
1053 1 Reserviert 232 1 
1054 2 1700 232 1 
1057 3 017697544266 232 1 
1058 4 232 1 
1039 2 573 231 1 
1040 3 088259216300 231 1 
1042 1 Reserviert 231 1 
1037 3 0043676845617203 230 1 
1045 2 2346,50 230 1 
1046 1 Reserviert 230 1 
1032 1 Anfrage 229 1 
1033 2 474 229 1 
1034 3 229 1 
1027 1 Anfrage 228 1 
1029 3 228 1 
1030 2 588,50 228 1 
1024 3 01729843043 227 1 
1025 1 Reserviert 227 1 
1023 2 990 227 1 
+0

Вы пропустили custom_attribute_id как имя 2-го столбца в БД отвала, я прав? – piotrm

+0

Рассмотрите возможность предоставления надлежащих DDL (и/или скриптов SQL) и желаемого результата. – Strawberry

+0

вы правы @piotm, просто забудьте заголовок «ID» для первого столбца –

ответ

1

Вы должны автообъединение так что вы можете иметь как статус и связанный полную цену в той же строке для каждого объекта. В основном вы принимаете часть таблицы только с данными состояния и другой частью таблицы с полными данными о ценах и присоединяете их к одному идентификатору объекта. В результирующем наборе вы можете легко получить сумму, используя WHERE, чтобы ограничить строки теми, у кого есть статус «Reserviert».

SELECT SUM(t2.attribute_value) AS value_sum 
FROM custom_attribute_values t1 JOIN custom_attribute_values t2 
    ON t1.entity_id = t2.entity_id 
    AND t1.custom_attribute_id = 1 
    AND t2.custom_attribute_id = 2 
WHERE t1.attribute_value = 'Reserviert' 

В этом запросе атрибут_значение содержит информацию о состоянии для t1 и полную цену для t2.

+0

Спасибо , с этим решением он работает perfekt –

1

Это должно быть

$result = mysql_query('SELECT SUM(attribute_value) AS value_sum 
      FROM custom_attribute_values 
      WHERE custom_attribute_id=2 AND entity_id = \'Reserviert\''); 
+0

извините, что не достаточно ясны, но цена и статус все в столбце «attribute_value», а entity_id просто имеет номер –

0

Вы можете использовать саб выбора, чтобы получить значение, как этого

SELECT entity AS e, 
    (SELECT SUM(value) FROM custom_attribute_values WHERE entity = e AND attribute = 2) AS s 
FROM custom_attribute_values 
WHERE value = 'Reserviert' 

Ваши имена таблиц и столбцов не было ясно, так что я сделал некоторые до ...

Первый ВЫБРАТЬ выбирает все Затем объекты «Reserviert» выбирают субвычисляет значения, связанные с каждым выбранным объектом.

Это данные, которые я использовал, с именами серийными, атрибут, значение, сущность, х

1124, 1, Anfrage,  233, 1 
1125, 2, 1188,   233, 1 
1126, 4, ,    233, 1 
1127, 3, 015757817858, 233, 1 
1053, 1, Reserviert, 232, 1 
1054, 2, 1700,   232, 1 
1057, 3, 017697544266, 232, 1 
1058, 4, ,    232, 1 
1039, 2, 573,   231, 1 
1040, 3, 088259216300, 231, 1 
1042, 1, Reserviert, 231, 1 
1037, 3, 004367684561, 230, 1 
1045, 2, 2346.50,  230, 1 
1046, 1, Reserviert, 230, 1 
1032, 1, Anfrage,  229, 1 
1033, 2, 474,   229, 1 
1034, 3, ,    229, 1 
1027, 1, Anfrage,  228, 1 
1029, 3, ,    228, 1 
1030, 2, 588.50,  228, 1 
1024, 3, 01729843043, 227, 1 
1025, 1, Reserviert, 227, 1 
1023, 2, 990,   227, 1 
+0

Это решение выглядит также хорошо, но я не могу его запустить. –

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