2013-01-14 94 views
1

我需要从两个不同的表中的数据来创建历史/存档我的网站,像这样的选择数据:从两个不同的表

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

我知道,有在计算器类似于这样一个问题:PHP MYSQL Blog Archive Menu by Year and Month

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

我一直在使用这个例子尝试:mysql select data from two tables and different structure,但我总是得到的错误“#1271 - 操作‘联盟’排序规则的非法组合”

有没有办法,我可以组合得到任何其他方式我像上面的数据?

我的两个表字段和结构:

1)新闻

  • ID(INT 5)
  • 标题(VARCHAR 200)
  • 内容(文本)
  • DATE_ADDED (日期时间)

2)设备

  • ID(INT 5)
  • 标题(VARCHAR 45)
  • 内容(VARCHAR 250)
  • DATE_ADDED(日期)

注:表身份证是自己的个人该文章的ID。我的桌子没有任何共同之处。

回答

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; 

然而,当我尝试了一下我自己,我发现所有类型的隐式转换。我再看看你的描述,并深入研究整理问题。我相信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; 

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

+0

对于MS SQL,正确的语法是'CAST(表达式AS类型)'。 –

+0

嗨,我已经试过了代码,但当我试图作为文本投射时出现错误。从我读过的内容中,转换或转换只允许BINARY [(N)],CHAR [(N)],DATE,DATETIME,DECIMAL [(M [,D])],SIGNED [INTEGER],TIME UNSIGNED [INTEGER] ? –

+0

@HamletHakobyan我误读了。将调整。 – Ilion

2

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

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

好吧,批评是足够的:)现在的解决方案,我认为你需要类似临时表的东西,这样你就可以1.查询你的表之一,2.将类型转换为任何匹配你的其他表,3.insert进入临时表。

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

+0

感谢您为什么我不能'联合'他们的解释!两张桌子是由两个不同的人完成的,因此有所不同。 –

+0

@TessLaker不客气。 –

+0

但是,如果您投射,则可以合并它们。 – Ilion