1

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

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)
  • 内容(文字)
  • date_added (日期时间)

2) 设备

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

注意:表格的 id 是它们自己的文章 id。我的桌子彼此没有任何共同之处。

4

2 回答 2

2

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

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

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

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

于 2013-01-14T05:37:38.443 回答
2

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

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

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

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;

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

于 2013-01-14T05:41:49.497 回答