MySQL Нужна помощь в построении запроса:объединение нескольких таблиц в одну строку

StackOverflow https://stackoverflow.com/questions/2485210

  •  21-09-2019
  •  | 
  •  

Вопрос

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

<2-я ПРАВКА 22 марта:>

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

таблица_one:

id  name          total
5   John Doe      20

таблица_тво:

id  product_id    price
5   51            17

таблица_трие:

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>

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

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

Мы были бы весьма признательны за любую помощь / руководство.

Спасибо!

--джед

Это было полезно?

Решение

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

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 нет проблем с маркировкой столбцов результирующего набора одинаковыми метками.Я предполагаю, что в вашем исходном запросе был select t1.* в select part.

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

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., т2. также)

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)

Редактировать 22МАР После изменения в образце данных кажется, что вы хотите превратить несколько строк из одной таблицы в одну.Вот конкретное решение (при условии, что у вас всегда будут строки Tax, Total и Subtotal и что вас интересуют только эти строки).

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 .

Другие советы

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top