【问题标题】:Select data from two different tables从两个不同的表中选择数据
【发布时间】:2012-12-28 03:13:20
【问题描述】:

我需要从两个不同的表中选择数据来为我的网站创建历史/存档,如下所示:

2012

  • 八月(6)
  • 九月(4)
  • 十月(2)

我知道stackoverflow中有一个类似的问题:PHP MYSQL Blog Archive Menu by Year and Month

但是,我有两个相似但不同的表。

我曾尝试使用此示例:mysql select data from two tables and different structure,但我总是收到错误“#1271 - Illegal mix of collat​​ions for operation 'UNION'”

还有其他方法可以结合起来获取我的数据吗?

我的两个表的字段和结构是:

1) 新闻

  • id (int 5)
  • 标题(varchar 200)
  • 内容(文本)
  • 添加日期(日期时间)

2) 设备

  • id (int 5)
  • 标题(varchar 45)
  • 内容(varchar 250)
  • 添加日期(日期)

注意:表格的 id 是文章各自的 id。我的表没有任何共同之处。

【问题讨论】:

    标签: mysql sql archive


    【解决方案1】:

    起初我认为数据类型是问题所在,您需要转换类型以匹配:

    SELECT id, title, content, cast(date_added as Date) FROM NEWS
    UNION ALL 
    SELECT id, title, cast(content as text), date_added FROM EQUIPMENT;
    

    但是,当我自己尝试时,我发现所有类型都隐式转换。我又看了你的描述,并深入研究了整理问题。我相信news 表中的content 列与Equipment 表中的content 列是不同的字符集和/或不同的排序规则类型。这可能适用于标题列或整个表格。您需要尝试转换。我建议这样做:

    SELECT 
      id, 
      convert(title using utf8) collate utf8_bin, 
      convert(content using utf8) collate utf8_bin, 
      date_added 
    FROM 
      NEWS
    UNION ALL
    
    SELECT 
      id, 
      convert(title using utf8) collate utf8_bin, 
      convert(content using utf8) collate utf8_bin, 
      date_added 
    FROM 
      EQUIPMENT;
    

    这应该可以解决您的问题。

    【讨论】:

    • 嗨,我已经尝试了代码,但是当我尝试转换为文本时出现错误。根据我的阅读,强制转换或转换只允许 BINARY[(N)], CHAR[(N)], DATE, DATETIME, DECIMAL[(M[,D])], SIGNED [INTEGER], TIME UNSIGNED [INTEGER] ?
    • 只需投射 date_added 列即可尝试。 Varchar 可能会隐式转换为文本。您也可以尝试仅选择 date_added 或 content 列来确定是哪一列出现问题。
    • @TessLaker 我对您的问题有了新的认识,并在上面的答案中添加了新信息。
    【解决方案2】:

    这是因为您试图将不同的类型联合在一起,这是不可能的。列数和类型应该匹配,以便您可以合并它们的表。

    日期和日期时间 - 你认为这些真的匹配吗?

    好的,批评就够了 :) 现在是解决方案,我认为您需要一个临时表之类的东西,以便您可以 1.查询您的一个表,2.将类型转换为与您的另一个表匹配的任何内容,3.插入临时表。

    现在您的临时表与您的表匹配。去联合他们。

    【讨论】:

    • 感谢您解释为什么我不能“联合”他们!这两张桌子是由两个不同的人做的,因此存在差异。
    • 是的,@Ilion 临时表不是必需的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-11
    • 1970-01-01
    • 2019-02-09
    • 2016-05-14
    • 1970-01-01
    相关资源
    最近更新 更多