MySQL Нужна помощь в построении запроса: объединить несколько таблиц в одну строку - PullRequest
4 голосов
/ 21 марта 2010

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

<2nd EDIT Mar22:>

Хорошо, я не понял, как на самом деле выглядели исходные данные, и поэтому я не мог получить то, что хотел. Спасибо @goran за то, что он подтолкнул меня к созданию настоящих исходных таблиц для публикации здесь (о которых я до сих пор не собираюсь публиковать, потому что мне лень редактировать их соответствующим образом для удобства просмотра и защиты невинных, но я должен был хотя бы распечатал их, прежде чем спрашивать). Ниже приведены новые пересмотренные примеры таблиц, но я до сих пор не выяснил, как достичь конечной цели - собрать все в один ряд.

table_one:

id  name          total
5   John Doe      20

table_two:

id  product_id    price
5   51            17

table_three:

id  text       number
5   Subtotal   17
5   Tax        3
5   Total      20

Я ищу что-то вроде этого:

id name     total product_id price text     number text number text   number
5  John Doe 20    51         17    Subtotal 17     Tax  3      Total  20

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

</ EDIT от 22 марта * </strong>

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

SELECT * FROM `table_one` AS t1 
INNER JOIN `table_two` AS t2 ON t1.id = t2.id 
INNER JOIN `table_three` AS t3 ON t1.id = t3.id 
WHERE 1

Результат:

id  text       number
5   Subtotal   17
5   Tax        3
5   Total      20

Мне нужно создать запрос, который будет выглядеть примерно так:

id  text       number  text  number  text   number
5   subtotal   17      Tax   3       Total  20

Любая помощь / руководство будет высоко ценится.

Спасибо!

- Джед

Ответы [ 3 ]

4 голосов
/ 21 марта 2010

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

mysql> select * from test t1 join test t2 on t1.a = t2.a LIMIT 1,5;
+------+------+------+------+
| a    | b    | a    | b    |
+------+------+------+------+
|    1 |    2 |    1 |    1 | 
|    1 |    1 |    1 |    2 | 
|    1 |    2 |    1 |    2 | 
|    2 |    2 |    2 |    2 | 
|    2 |    2 |    2 |    2 | 
+------+------+------+------+
5 rows in set (0.00 sec)

Mysql без проблем помечает столбцы набора результатов одинаковыми метками. Я полагаю, что в исходном запросе было выбрано t1. * В выделенной части.

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

mysql> select a from test t1 join test t2 on t1.a = t2.a LIMIT 1,5;
ERROR 1052 (23000): Column 'a' in field list is ambiguous

И вы должны точно указать, что вы хотите (псевдонимы столбцов являются необязательными, вы можете сделать t1. , t2. )

mysql> select t1.a first, t2.a second from test t1 join test t2 on t1.a = t2.a LIMIT 1,5;
+-------+--------+
| first | second |
+-------+--------+
|     1 |      1 | 
|     1 |      1 | 
|     1 |      1 | 
|     2 |      2 | 
|     2 |      2 | 
+-------+--------+
5 rows in set (0.00 sec)

Редактировать 22MAR После изменения примера данных кажется, что вы хотите превратить несколько строк из одной таблицы в одну. Вот конкретное решение (при условии, что у вас всегда будут строки «Налог», «Итого» и «Итого» и что вас интересуют только эти строки).

SELECT t1.id, t1.name, t2.product_id, t2.price, t3a.number subtotal, t3b.number total, t3c.number tax
FROM `table_one` AS t1 
INNER JOIN `table_two` AS t2 ON t1.id = t2.id 
INNER JOIN `table_three` AS t3a ON t1.id = t3a.id and t3a.text = "Subtotal"
INNER JOIN `table_three` AS t3b on t3a.id = t3b.id and t3b.text = "Total"
INNER JOIN `table_three` AS t3c on t3b.id = t3c.id and t3c.text = "Tax"

(при желании вы можете также выбрать константы "Налог", "Итого" и "Итог" в выделенной части и дать им некоторые имена столбцов)

Одна вещь, которая остается неясной, это отношения между идентификаторами в таблицах - являются ли они первичным ключом table_one или table_two. Конечно, это может повлиять на результаты, когда у вас будет несколько строк в table_one и table_two.

1 голос
/ 21 марта 2010

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

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

1 голос
/ 21 марта 2010

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

Вам следует пересмотреть дальнейшее использование возвращенных записей и обновить его, чтобы обработать фактический результат, как только SQL select будет возвращать данные в обычном режиме.

...