【问题标题】:one query instead of four - is it possible?一个查询而不是四个查询 - 有可能吗?
【发布时间】:2010-05-17 16:46:54
【问题描述】:

我必须从四个表中获取数据。我用四个查询编写了脚本,但我在 ajax 中使用它,我不想通过一个查询来完成。 这是查询...

$query1 = "SELECT `id`,`name_ar` FROM `tour_type` ORDER BY `order`";
$query2 = "SELECT `id`,`name_ar` FROM `hotel_type` ORDER BY `order`";
$query3 = "SELECT `id`,`name_ar` FROM `food_type` ORDER BY `order`";
$query4 = "SELECT `id`,`name_ar` FROM `cities` WHERE `id_parrent` = '$id_parrent' ORDER BY `name_ar`";

是否可以写在一个查询中? 谢谢

表的结构 tour_type

id | name_ar | name_ru | name_en | order |

food_type
id | name_ar | name_ru | name_en | order |

hotel_type
id | name_ar | name_ru | name_en | order |

cities
id | id_parrent | name_ar | name_ru | name_en | order |

【问题讨论】:

  • 大多数答案都很好地以一种或另一种方式使用UNION (ALL)。我只是想强调一下,columns names 在您的所有表中都相同并不重要,但column data types 必须兼容。

标签: sql mysql phpmyadmin union


【解决方案1】:

UNION [ALL] 函数允许您组合多个查询,但所有查询之间的列数据类型和顺序必须相同。此外,UNION 将删除重复项 - 使其比使用 UNION ALL 慢(不会删除重复项)。

也就是说,UNION 语句不允许对每个语句使用 ORDER BY,但如果您将查询放在括号内,MySQL 支持这一点。使用:

(SELECT id, name_ar FROM tour_type ORDER BY order)
UNION ALL
(SELECT id, name_ar FROM hotel_type ORDER BY order)
UNION ALL
(SELECT id, name_ar FROM food_type ORDER BY order)
UNION ALL
(SELECT id, name_ar FROM cities WHERE id_parent = ? ORDER BY name_ar)

【讨论】:

  • 是的,UNION ALL 的神奇之处在于它保持结果集不变,因此它保持各个查询的顺序。请务必通过添加类型列来使用上面@David M 的建议。
  • @Marcus Adams:当然......如果需要(或要求)。我看没有这样的要求。
【解决方案2】:

当然,使用UNION。如果对您很重要,您可以包含关于行来源的伪列:

SELECT id,name_ar,'tour' FROM tour_type
UNION
SELECT id,name_ar,'hotel' FROM hotel_type
UNION
SELECT id,name_ar,'food' FROM food_type
UNION
SELECT id,name_ar,'cities' FROM cities WHERE id_parrent = $id_parrent

您可能需要随意使用ORDER

【讨论】:

  • 一个 UNION/UNION ALL 语句只能有一个 ORDER BY 子句。 OP 为每个语句列出一个 ORDER BY...
  • 确保为类型指定一个列名,例如'tour' AS row_type'hotel' AS row_type
  • +1 表示伪列。此外,我会为该列命名,并使用 UNION ALL 代替 UNION 以避免不必要的排序和过滤,因为我们先验地知道没有重叠。
【解决方案3】:

一种快速简便的方法是尝试四个select 语句中的UNION。只要列数相同且列名相同,您的数据库系统就应该让您逍遥法外。

我们可能不应该涉足关系建模/设计,因为有许多不同的意见和风格,但是......如果它们都只是“类型”,那么也许它们应该放在一个表中。给这只猫剥皮的方法有很多。

【讨论】:

  • 列名实际上不必相同。 MySQL 将使用指定的第一个列名。
  • 一个 UNION/UNION ALL 语句只能有一个 ORDER BY 子句。
【解决方案4】:

我认为您可以像这样使用 UNION 来做到这一点:

SELECT `id`,`name_ar` FROM `tour_type` ORDER BY `order`

UNION

SELECT `id`,`name_ar` FROM `hotel_type` ORDER BY `order`

使用 UNION 或使用 UNION ALL 由您决定。更具体的例子可以看这里Union sqlserver

【讨论】:

    【解决方案5】:

    由于您的列数一致,您可以使用某种键标识符将它们合并在一起,例如:

    select 'TBL1' as table_identifier, id, name from TBL1
    union
    select 'TBL2' as table_identifier, id, name from TBL2
    ...
    

    但是 4 个写得很好、映射到单个对象的查询会是更好的设计,除非您迫切需要这些额外的毫秒,否则我会坚持使用良好的设计而不是快速而肮脏的查询。

    【讨论】:

      猜你喜欢
      • 2011-05-12
      • 1970-01-01
      • 2019-11-05
      • 2018-09-11
      • 1970-01-01
      • 2011-04-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多