【问题标题】:mysql : multiple SELECT statements in Common Table Expressionmysql:公用表表达式中的多个 SELECT 语句
【发布时间】:2020-10-08 11:53:41
【问题描述】:

需要将多项选择合并到一个查询中。

MariaDB [aix_registry]> SELECT n.name AS WBG from entries e LEFT JOIN nodes n on n.id=e.node_id LEFT JOIN attribs a on a.id=e.attrib_id WHERE  a.name= 'LOCATION' AND e.value='Wienerberg' AND DATE(ts) = CURDATE() LIMIT 5;
+--------------------+
| WBG                |
+--------------------+
| KUG01171_TQLENTW03 |
| AIXSAWBG3          |
| AIXAPPL1EDUC       |
| KUG0114_DDAITAATU  |
| AIXSAPP03C1_HA     |
+--------------------+
5 rows in set (0.001 sec)

MariaDB [aix_registry]> SELECT n.name AS LNZ from entries e LEFT JOIN nodes n on n.id=e.node_id LEFT JOIN attribs a on a.id=e.attrib_id WHERE  a.name= 'LOCATION' AND e.value='Gruberstrasse' AND DATE(ts) = CURDATE() LIMIT 5;
+-------------------+
| LNZ               |
+-------------------+
| ARR5S1P8_OOEGKKPR |
| AIXSAGRU2         |
| AIXSTP11R3DB      |
| STP17T2_SGKKT2    |
| ARR5S1P9_TIC      |
+-------------------+
5 rows in set (0.001 sec)

输出应该是这样的,并且解决方案应该可以扩展到任何数量的查询。这里的两个只是 例子。

+-------------------+--------------------+
| LNZ               | WBG                |
+-------------------+--------------------+
| ARR5S1P8_OOEGKKPR | KUG01171_TQLENTW03 | 
| AIXSAGRU2         | AIXSAWBG3          | 
| AIXSTP11R3DB      | AIXAPPL1EDUC       |
| STP17T2_SGKKT2    | KUG0114_DDAITAATU  |
| ARR5S1P9_TIC      | AIXSAPP03C1_HA     |
+-------------------+--------------------+

【问题讨论】:

  • 没有 ORDER BY 的 LIMIT 没有意义。

标签: mysql mariadb common-table-expression


【解决方案1】:
WITH
cte AS ( SELECT n.name,
                e.value, 
                ROW_NUMBER() OVER (PARTITION BY e.value 
                                   ORDER BY {expression-1}) AS rn
         from entries e 
         LEFT JOIN nodes n on n.id=e.node_id 
         LEFT JOIN attribs a on a.id=e.attrib_id 
         WHERE  a.name = 'LOCATION' 
           AND e.value IN ('Wienerberg', 'Gruberstrasse')
           AND DATE(ts) = CURRENT_DATE
         ORDER BY {expression-2}
       ),
nums AS ( SELECT 1 rn UNION 
          SELECT 2 UNION 
          SELECT 3 UNION 
          SELECT 4 UNION 
          SELECT 5
        )
SELECT t1.name LNZ, t2.name WBG
FROM nums
LEFT JOIN cte t1 ON nums.rn = t1.rn
LEFT JOIN cte t2 ON nums.rn = t2.rn
WHERE t1.value = 'Gruberstrasse'
  AND t2.value = 'Wienerberg'
--  AND COALESCE(t1.name, t2.name)
ORDER BY nums.rn 

【讨论】:

  • 这会产生错误 -> #1054 - 未知列 '???'在“订单条款”中
  • @flynn1973 您是否将 ORDER BY 表达式占位符替换为一些特定的表达式?
  • ORDER BY 是强制性的吗?我不知道我应该点什么。
  • 在没有 order by 子句的情况下不起作用 -> #1052 - order 子句中的列 'rn' 不明确
  • @flynn1973 想象一下有 10 个匹配的行。您只想收到其中的 5 个。如果您不指定 orderring,您将收到 10 行中的 5 行 - 下一次查询可能会轻松返回另外 5 行。这是不好的。因此,您必须使用一些唯一的排序来始终在相同的数据上接收相同的结果。例如,它可能是 e.id... 或 e.ts 如果它是唯一的... 或其他。
猜你喜欢
  • 2010-10-09
  • 1970-01-01
  • 1970-01-01
  • 2014-03-31
  • 1970-01-01
  • 2016-12-19
  • 2012-08-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多