2013-06-23 2 views
1

Попытка написать оператор, где в одном выражении выберите все (*) и суммируйте один столбец из одной базы данных и той же таблицы, в зависимости от условий.MySQL SELECT SUM (столбец) и SELECT * Нарушение кардинальности: 1241 Операнд должен содержать 1 столбец

написал такое заявление (на основе этой Multiple select statements in Single query)

SELECT (SELECT SUM(Amount) FROM 2_1_journal), (SELECT * FROM 2_1_journal WHERE TransactionPartnerName = ?)

Я понимаю, что SELECT SUM(Amount) FROM 2_1_journal будет суммировать все значения в столбце Amount (не на основе codition).

Но сначала хочу понять, что это правильное утверждение

С выше утверждением получаю ошибку SQLSTATE[21000]: Cardinality violation: 1241 Operand should contain 1 column(s)

Не могу понять сообщение об ошибке. Из рекомендаций здесь MySQL - Operand should contain 1 column(s) понять, что в подзапросе SELECT * FROM 2_1_journal WHERE TransactionPartnerName = ? должен выбрать только один столбец?

Пытался изменить заявление по этому SELECT (SELECT * FROM 2_1_journal WHERE TransactionPartnerName = ?), (SELECT SUM(Amount) FROM 2_1_journal), но получить ту же ошибку ...

Что бы правильное утверждение?

ответ

2
SELECT *, (SELECT SUM(Amount) FROM 2_1_journal) 
    FROM 2_1_journal 
WHERE TransactionPartnerName = ? 

Это выбирает резюмирует Amount из всего таблицы и «присоединяет» все строки, где TransactionPartnerName является параметром свяжет в коде клиента.

Если вы хотите, чтобы ограничить сумму те же критерии, что и строки вы выбираете, просто включите его:

SELECT *, (SELECT SUM(Amount) FROM 2_1_journal WHERE TransactionPartnerName = ?) 
    FROM 2_1_journal 
WHERE TransactionPartnerName = ? 

целой другой вещи: имена таблиц, как 2_1_journal сильных показатели разбитого проектирования баз данных. Если вы можете его переделать, вы должны посмотреть, как правильно нормализовать базу данных. Скорее всего, окупится много раз.

Что касается нормализации (добавлена ​​позже):

Поскольку текущий дизайн использует ключи в именах таблиц (таких как 2 и 1 в 2_1_journal), я быстро показать, как я думаю, что вы можете значительно улучшить этот дизайн. Допустим, что таблица 2_1_journal имеет следующие данные (я только предполагаю здесь, потому что таблицы не были описаны еще нигде):

title | posted  | content 
------+------------+----------------- 
Yes! | 2013-01-01 | This is just a test 
2nd | 2013-01-02 | Another test 

Этот материал относится к пользователю 2 в компании 1. Но эй! Если вы посмотрите на строки, то тот факт, что эти данные принадлежат пользователю 2 в компании 1, нигде не встречается.

Проблема заключается в том, что эта конструкция нарушает один из основных принципов проектирования базы данных: не используйте ключи в именах объектов (здесь: таблицы). Явное указание на то, что что-то очень не так, если вам нужно создавать новые таблицы, если добавляется что-то новое. В этом случае добавление нового пользователя или новой компании требует добавления новых таблиц.

Эта проблема устранена.Создать один таблица с именем journal. Затем, используя одни и те же столбцы, но добавить еще два:

company | user | title | posted  | content 
--------+------+-------+------------+----------------- 
     1 | 2 | Yes! | 2013-01-01 | This is just a test 
     1 | 2 | 2nd | 2013-01-02 | Another test 

Делая это, как это означает, что:

  • вы никогда добавлять или изменять таблицы, если только изменения приложений.
  • Выполнение объединений между компаниями или пользователями (и все остальное, что раньше было частью схемы именования таблиц, теперь возможно с помощью одного довольно простого оператора select).
  • Обеспечение целостности легко: если вы обновляете приложение и хотите изменить таблицы, изменения не должны повторяться для каждой компании и пользователя. Что еще более важно, это снижает риск того, что приложение не синхронизируется с таблицами в базе данных (например, добавляет поле comments ко всем таблицам x_y_journal, но забывает 5313_4324_journal, заставляя приложение прерывать только при входе пользователя 5313. Это та проблема, с которой вы не хотите иметь дело.

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

+0

В отношении имен таблиц проблема связана с '_'? Такие имена таблиц связаны с тем, что: i) таблица: «пользователи», и каждый пользователь имеет свой номер (например, номер два). ii) тогда номер таблицы «2_» связан только с конкретным пользователем. В эту таблицу включены компании, связанные с конкретными пользователями и компаниями, пронумерованы, например, 1, 2, 3, 4; iii) для каждой компании существует несколько таблиц, например, журнал, сотрудники, склад. Итак, 2_1_journal означает журнал для пользователя № 2, компания № 1. Я думаю о именах таблиц, и это было решение, которое я выбираю .... – user2360831

+0

Вы рассматривали добавление столбца с именем '' Company'' в таблицы '' like'', '' журнал'' и т. д.? То, что вы делаете, крайне нетрадиционно и, вероятно, вызовет проблемы в будущем. – mzedeler

+1

Здесь вы можете посмотреть учебники по нормализации: http://www.youtube.com/watch?v=ygfikznRjpw и http://holowczak.com/database-normalization/. – mzedeler

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