从两个不同的表中选择数据

时间:2013-01-14 05:34:52

标签: mysql sql archive

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

2012

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

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

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

我尝试过使用这个例子:mysql select data from two tables and different structure,但我总是得到错误“#1271 - 操作'非法混合操作'UNION'”

我可以通过其他任何方式来获取上述数据吗?

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

1)新闻

  • id(int 5)
  • title(varchar 200)
  • 内容(文字)
  • date_added(datetime)

2)设备

  • id(int 5)
  • title(varchar 45)
  • content(varchar 250)
  • date_added(date)

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

2 个答案:

答案 0 :(得分:2)

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

日期& datetime - 你认为这些真的匹配吗?

好的,批评是真的:)现在的解决方案,我认为你需要像临时表这样的东西,以便你可以1.查询你的一个表,2.转换类型到任何匹配你的其他表,3。插入临时表。

现在你的临时表与你的表匹配。去和他们联盟。

答案 1 :(得分: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列与content表中的Equipment列的字符集不同和/或排序类型不同。这可能适用于标题列或整个表。你需要尝试转换。我建议这样做:

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;

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