【问题标题】:MySQL: Combining the results of 2 columns in one statementMySQL:在一个语句中组合 2 列的结果
【发布时间】:2012-12-10 02:14:37
【问题描述】:

假设我有 2 个结果集如下

 R1        R2
| 1 |     | 5 |
| 2 |     | 6 |
| 3 |     | 7 |
| 4 |     | 8 |

我需要将这些结果组合成一个 SET, 所以我会有这样的东西:

 R3
| 1 |
| 2 |
| 3 |
| 4 |
| 5 |
| 6 |
| 7 |
| 8 |

目前, 我正在使用这样的 UNION 来执行此操作:

SELECT c_1 AS result FROM table WHERE c_1=3 OR c_2=3
UNION
SELECT c_2 AS result FROM table WHERE c_1=3 OR c_2=3

基本上,我最终在桌子上执行了两次相同的操作, 每次只检索不同的行。 有没有更有效的方法可以做到这一点? 我需要将结果放在单个列中,因为这是 IN 的限制。 从长远来看,我需要做的是这个

SELECT name FROM person WHERE person_id IN
(SELECT c_1 AS result FROM table WHERE c_1=3 OR c_2=3
UNION
SELECT c_2 AS result FROM table WHERE c_1=3 OR c_2=3)

有没有更好的方法来找到所有这些? 欢迎任何和所有帮助。

【问题讨论】:

  • SQL 声明了想要的结果,而不是计算方法。为此使用命令EXPLAIN
  • 不能用SELECT c_1 as r1, c_2 as r2...吗?另外,您使用的是result 变量吗?
  • 就我个人而言,我尽可能避免使用 IN,除非我知道它始终是小桌子中的一小部分。 Michael Berkowski 的回答是我使用inner join 的首选方式。只需确保您对打算用作键的所有内容都有索引或设置适当的外键以提高性能。
  • @Levi Aye,请记住这一点。

标签: mysql sql join union


【解决方案1】:

除了IN () 子查询,您可以在任一 c_1 OR c_2 上执行INNER JOIN

SELECT
  name
FROM 
  person
  /* Join against the other table on *either* column c_1 or c_2 */
  INNER JOIN `table` ON `table`.c_1 = person.person_id OR `table`.c_2 = person.person_id
WHERE
  /* And the WHERE condition only needs to be applied once */
  c_1 = 3 OR c_2 = 3

http://sqlfiddle.com/#!2/4d159/1

【讨论】:

  • 好东西!像魅力一样工作。
  • @GreyOne 太好了 - 很乐意提供帮助,欢迎使用 Stack Overflow。
猜你喜欢
  • 2017-08-22
  • 1970-01-01
  • 1970-01-01
  • 2012-08-16
  • 1970-01-01
  • 2011-02-16
  • 2015-03-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多