【问题标题】:MySQL mariaDB union select execution ignoranceMySQL mariaDB union 选择执行无知
【发布时间】:2021-08-16 15:47:36
【问题描述】:

一个结构化查询中有两个表,如下所示

SELECT "field" 

UNION SELECT "<category_id>" 
UNION SELECT category_id FROM categories
UNION SELECT "</category_id>"

UNION SELECT "<inventory_id>"
UNION SELECT inventory_id FROM inventories
UNION SELECT "</inventory_id>"

UNION SELECT "<inventory_name>"
UNION SELECT inventory_name FROM inventories
UNION SELECT "</inventory_name>"

UNION SELECT "<category_name>" 
UNION SELECT category_name FROM categories
UNION SELECT "</category_name>"

查询结果:

field
field
category_id
1
2
3
category_id
inventory_id
inventory_id
inventory_name
inv1
inv2
inv3
inventory_name
category_name
cate1
cate2
cate3
category_name

&lt;inventory_id&gt;&lt;/inventory_id&gt; 应包含 1,即 inventory.inventory_id 记录

通知 当我在查询中将&lt;inventory_id&gt;&lt;/inventory_id&gt; 移动到&lt;category_id&gt;&lt;/category_id&gt;

我在&lt;inventory_id&gt;&lt;/inventory_id&gt; 中得到了预期的结果,但&lt;category_id&gt;&lt;/category_id&gt; 是空的

用于模拟的表结构

create table inventories(inventory_id int AUTO_INCREMENT, inventory_name varchar(255), PRIMARY key (inventory_id));
create table categories(category_id int AUTO_INCREMENT, category_name varchar(255), PRIMARY key (category_id));
INSERT INTO categories(category_name) VALUES("cate1"),("cate2"),("cate3");
INSERT INTO inventories(inventory_name) VALUES("inv1"),("inv2"),("inv3");

使用顶部选择查询获取结果

我使用https://sqliteonline.com/ 用phpmyadmin 模拟它并得到相同的结果

【问题讨论】:

  • 你真的要field出现在查询结果中,还是应该是列名?
  • mainUncategories 在您的输出中来自哪里?示例类别名称为 cate1cate2cate3
  • 您的结果中的&lt;/&gt; 在哪里?
  • @Barmar 缺少的尖括号可能只是被浏览器隐藏了。我会更担心结果更改的顺序,因为 SQL 将不保证记录按列出的顺序返回。它可能似乎会以这种方式返回,但随后您将其移至生产服务器,突然其中一张表中的SELECT 被延迟以利用现有索引遍历。
  • 这应该是生成 XML 吗?如果是这样,每个项目不应该被包装在自己的标签中,而不是每个列表周围的标签吗?

标签: mysql sql mariadb


【解决方案1】:

您需要使用UNION ALL。默认情况下,UNION 会删除重复项,并且 category_idinventory_id 的某些值是相同的。

【讨论】:

  • 此外,UNION DISTINCT 可能会重新排列行 - 即使没有删除任何行。
  • 确实,当我在 sqliteonline.com 或 sqlfiddle.com 上测试查询时,结果是按字典顺序排序的。还有一个我无法解释的NULL 行。
  • 当我在 union 删除重复值之前使用 union all 时,它会起作用。但如果你能告诉我在哪种情况下它会返回空行。
  • 我得到了您原始查询的空行。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-08-17
  • 1970-01-01
  • 1970-01-01
  • 2020-11-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多