MYSQL - Как можно выделить непересекающиеся столбцы в одном запросе? - PullRequest
0 голосов
/ 01 июля 2010

У меня есть 4 таблицы с разными столбцами, но все они имеют один общий столбец. Это столбец целочисленного идентификатора. Таким образом, у меня будет некоторое целое число x, и я хочу, чтобы все строки из всех 4 таблиц имели этот столбец id равным x.

Я пробовал что-то похожее на:

SELECT table1.col1, table2.col2 FROM table1 LEFT JOIN table2 ON table1.id=x OR coastlinessports.id=x

и я получаю обратно строки, в которых оба столбца из обеих таблиц находятся в одной строке.

Таким образом, один блок результата будет иметь:

table1.col1, table2.col2

Но я очень хочу:

table1.col1
tale2.col2

Есть ли способ, которым я могу сделать это, не выполняя 4 запроса на выбор подряд?

Ответы [ 4 ]

2 голосов
/ 01 июля 2010

Если вы хотите, чтобы последовательные строки из разных таблиц возвращали разное количество строк для каждой таблицы, вы можете использовать UNION.Однако для UNION требуется, чтобы каждый SELECT возвращал одинаковое количество столбцов, поэтому вам необходимо заполнить отсутствующие столбцы значением (или NULL), например:

DROP TABLE IF EXISTS `table1`;
DROP TABLE IF EXISTS `table2`;

CREATE TABLE `table1` (
  `id` int(11) NOT NULL auto_increment,
  `col1` VARCHAR(255),
  `col2` VARCHAR(255),
  PRIMARY KEY  (`id`)
) ENGINE=InnoDB;

CREATE TABLE `table2` (
  `id` int(11) NOT NULL auto_increment,
  `col1` VARCHAR(255),
  PRIMARY KEY  (`id`)
) ENGINE=InnoDB;

INSERT INTO `table1` VALUES
    (1, '1,1', '1,2'),
    (2, '2,1', '2,2');

INSERT INTO `table2` VALUES
    (1, '1,1'),
    (2, '2,1');

SELECT `id`, `col1`, `col2` FROM `table1` WHERE `id` = 1
UNION
SELECT `id`, `col1`, NULL AS `col2` FROM `table2` WHERE `id` = 1;

+----+------+------+
| id | col1 | col2 |
+----+------+------+
|  1 | 1,1  | 1,2  |
|  1 | 1,1  | NULL |
+----+------+------+

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

SELECT `col1`, `col2` FROM (
    SELECT `id`, `col1`, `col2` FROM `table1` WHERE `id` = 1
    UNION
    SELECT `id`, `col1`, NULL AS `col2` FROM `table2` WHERE `id` = 1
) AS `t1`
ORDER BY col2;

+------+------+
| col1 | col2 |
+------+------+
| 1,1  | NULL |
| 1,1  | 1,2  |
+------+------+

Это то, что вам нужно?

0 голосов
/ 01 июля 2010

Если таблица называется одинаковой, вы можете использовать USING А для части заданного значения используйте WHERE

select * from table1 join table2 using(commonColumn) join table3 using(commonColumn) join table4 using(commonColumn) where commonColumn="desiredValue"

Обновление: при повторном чтении вашего вопроса Вы хотите этого?

Все строки таблицы1, где commonColumn = "requiredValue"
Вслед за
Все строки таблицы2, где commonColumn = "требуемая величина"
Вслед за
Все строки таблицы 3, где commonColumn = "requiredValue"
Вслед за
Все строки таблицы4, где commonColumn = "requiredValue"

Если это так, вам нужно использовать UNION (и вам нужно сделать 4 выбора) Если количество столбцов отличается, необходимо заполнить пробелы с псевдонимами

SELECT col1, col2, col3, col4 from table1 where commonColumn="desiredValue"  
UNION
SELECT col1, col2, 0 as col3, 0 as col4 from table2 where commonColumn="desiredValue"  
...
0 голосов
/ 01 июля 2010

Вы должны проверить этот пост. Кажется, что вы просите: http://ask.sqlteam.com/questions/870/pivoting-multiple-rows-into-one-row-with-multiple-columns

0 голосов
/ 01 июля 2010

Это, вероятно, не ответит на ваш вопрос, но есть что-то странное в JOIN.

Обычно условие «ВКЛ» относится к объединению обеих таблиц, подобно этому:

... FROM table1 LEFT JOIN table2 ON table1.id = table2.id ...

Полагаю, могут быть случаи, когда вы этого не сделаете, но я не могу придумать ни одного.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...