1

次のように、Web サイトの履歴/アーカイブを作成するには、2 つの異なるテーブルからデータを選択する必要があります。

2012年

  • 8月(6)
  • 9月(4)
  • 10月(2)

stackoverflow に次のような質問があることは承知しています: PHP MYSQL Blog Archive Menu by Year and Month

ただし、似ているが異なるテーブルが 2 つあります。

この例を使用してみました: mysql select data from two tables and different structureですが、常に「#1271 - オペレーション 'UNION' の照合順序が不正に混在しています」というエラーが発生します。

上記のようなデータを取得するために組み合わせることができる他の方法はありますか?

私の2つのテーブルのフィールドと構造は次のとおりです。

1) お知らせ

  • ID (整数 5)
  • タイトル (varchar 200)
  • 内容(テキスト)
  • date_added (日時)

2) 装備

  • ID (整数 5)
  • タイトル (varchar 45)
  • コンテンツ (varchar 250)
  • date_added (日付)

注: テーブルの ID は、記事の個別の ID です。私のテーブルには、互いに共通点はありません。

4

2 に答える 2

2

それは、異なるタイプを一緒にユニオンしようとしているからです。これは不可能です。テーブルを結合できるように、列の数とタイプが一致する必要があります。

date & datetime - これらは本当に一致すると思いますか?

OK、批判は十分です:)これで解決策です。1.テーブルの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表の列とは異なる文字セットおよび/または異なる照合タイプであると私は信じてい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;

それはあなたの問題を解決するはずです。

于 2013-01-14T05:41:49.497 に答える