mysql-在两列中查询或,然后返回一个名称

mysql-在两列中查询或,然后返回一个名称,mysql,sql,Mysql,Sql,我有一个关于mysql查询的问题。我将编写一个mysql查询,在两列中搜索两个案例,然后这两列的返回数据应该具有相同的名称。我目前的查询想法如下: SELECT * FROM `Table` WHERE (name=test AND `first_col` is NOT NULL) OR (name=test AND `second_column` is NOT NULL) 然后我得到了这样的结果: | id | name | first_col | second_col | +-

我有一个关于mysql查询的问题。我将编写一个mysql查询,在两列中搜索两个案例,然后这两列的返回数据应该具有相同的名称。我目前的查询想法如下:

SELECT * FROM `Table`
WHERE (name=test AND `first_col` is NOT NULL) OR (name=test AND `second_column` is NOT NULL)
然后我得到了这样的结果:

| id |  name | first_col     | second_col  |
+----+-------+---------------+-------------+
|  1 |  test | [unused_data] |   [data]    |
+----+-------+---------------+-------------+
|  2 |  test | [data]        | unused_data]|
+----+-------+---------------+-------------+
所以我想要这样的东西

| id |  name | col     |
+----+-------+---------+
|  1 |  test | [data]  |
+----+-------+---------+
|  2 |  test | [data]  |
+----+-------+---------+
如果事件id相同但与上述两个条件匹配,则应显示在单独的行中

| id |  name | col     |
+----+-------+---------+
|  1 |  test | [data]  |
+----+-------+---------+
|  2 |  test | [data]  | // from first_col
+----+-------+---------+
|  2 |  test | [data]  |  // from second_col
+----+-------+---------+
我需要你们的帮助,伙计们!谢谢大家!

将查询一分为二(每列一个),并将其与
UNION ALL
组合:

SELECT id, name, first_col as col
FROM `Table`
WHERE name ='test' AND first_col is NOT NULL

UNION ALL

SELECT id, name, second_column as col
FROM `Table`
WHERE name='test' AND second_column is NOT NULL

ORDER BY id -- optional
将查询一分为二(每列一个),并将其与
UNION ALL
组合:

SELECT id, name, first_col as col
FROM `Table`
WHERE name ='test' AND first_col is NOT NULL

UNION ALL

SELECT id, name, second_column as col
FROM `Table`
WHERE name='test' AND second_column is NOT NULL

ORDER BY id -- optional

没有工会的替代方案

SELECT
         d.id 
       , d.NAME 
       , d.col
FROM (
      SELECT
               t.id 
             , t.NAME 
             , CASE 
                 WHEN e.xtra = 'a' THEN t.first_col 
                 WHEN e.xtra = 'b' THEN t.second_col 
               END AS col 
      FROM   table1 t 
      CROSS JOIN (select 'a' xtra union all select 'b') AS e 
      WHERE  NAME = test 
      ) d
WHERE d.col IS NOT NULL

没有工会的替代方案

SELECT
         d.id 
       , d.NAME 
       , d.col
FROM (
      SELECT
               t.id 
             , t.NAME 
             , CASE 
                 WHEN e.xtra = 'a' THEN t.first_col 
                 WHEN e.xtra = 'b' THEN t.second_col 
               END AS col 
      FROM   table1 t 
      CROSS JOIN (select 'a' xtra union all select 'b') AS e 
      WHERE  NAME = test 
      ) d
WHERE d.col IS NOT NULL

谢谢你的快速回复,保罗!给我几分钟来测试和确认你的答案!非常感谢。它像我期望的那样工作:)!顺便问一下,Paul,你能给我推荐一些文章或书籍来改进mysql数据库设计吗?我使用nosql已经很长时间了,当我回到mysql时,我真的迷路了……@Kai抱歉,我不知道任何特定于设计的源代码,但我很确定有一些好书。我可以建议的是,官方的,当然还有官方的。另外一个很好的来源是-虽然更注重性能。感谢您的快速响应保罗!给我几分钟来测试和确认你的答案!非常感谢。它像我期望的那样工作:)!顺便问一下,Paul,你能给我推荐一些文章或书籍来改进mysql数据库设计吗?我使用nosql已经很长时间了,当我回到mysql时,我真的迷路了……@Kai抱歉,我不知道任何特定于设计的源代码,但我很确定有一些好书。我可以建议的是,官方的,当然还有官方的。另外一个很好的来源是-虽然更注重性能。事实上,我看到你的查询也有联合所有哈哈。但是谢谢你的建议,新的东西要学习:Dmy查询使用
交叉连接
,它将表中的行乘以2,在这个查询中没有
联合所有
。您可能会发现它比使用
union-all
更有效,但这需要测试。事实上,我看到您的查询也有union-all哈哈。但是谢谢你的建议,新的东西要学习:Dmy查询使用
交叉连接
,它将表中的行乘以2,在这个查询中没有
联合所有
。您可能会发现它比使用
union-all
更有效,但这需要测试。