質問

3つの個別のテーブルのデータを使用するRSSフィードをPHPで作成しています。表はすべて、サイトのさまざまな領域内のページを参照しています。私が抱えている問題は、XML内にリンクフィールドを作成しようとしていることです。各レコードがどのテーブルからのものであるかがわからないと、正しいリンクを作成できません。

この問題を解決する方法はありますか? mysql_fetch_fieldを使用してみましたが、テーブルに空の値が返されました。

$sql = "
SELECT Title FROM table1
UNION 
SELECT Title FROM table2
UNION 
SELECT Title FROM table3";

他のフィールドも含まれますが、これは基本的に私が使用しているクエリです。

ご協力いただければ幸いです。

ありがとう。

役に立ちましたか?

解決

十分に簡単なはずです。次のようにします。

$sql = "
SELECT Title, 1 FROM table1
UNION ALL
SELECT Title, 2 FROM table2
UNION ALL
SELECT Title, 3 FROM table3";

他のヒント

次のように列リストに定数を追加するだけです:

select 'table1' as table_name, title from table1
union all
select 'table2' as table_name, title from table2
union all
select 'table3' as table_name, title from table3

次のようになります:

table_name | title
-----------+-----------------------------
table1     | war and peace
table2     | 1984
table3     | terminator salvation

など。

これにより、リンクへの変換を容易にする文字列データ型を使用できます(特に、検索または変換するのではなく、ページにコピーするだけの値を使用する場合)。 句を使用すると、他の列と同様に(名前で)参照できます。

union all の使用に注意してください-テーブルから重複する行がないことが確実な場合(この場合、おそらくそれぞれに異なる table_name 値があり、タイトルが一意であると想定しています)、 union all は、無駄なソートと削除と重複の操作を回避できます。 union を単独で使用すると、不要な作業が行われる可能性があります。

重複の削除を行う場合は、 union の使用に戻ります。

一定の値を持つダミー列を追加します。例えば。 "「funky_table」をsource_tableとして選択し、タイトルをfunky_tableから選択します"句ごとに異なる名前を引用符で囲みます。

上記のクエリでは行が2回レンダリングされないため、以下のクエリの方が適切に機能し、より良いアイデアが得られます。

SELECT t1.*,t1.table_name
FROM
t1
UNION ALL
SELECT t2.*,t2.table_name
FROM
t2
LEFT OUTER JOIN 
t1
ON t1.id=t2.id
WHERE t1.id=null

上記のスクリプトは重複するデータ行を与えないようにし、

  1. ソースt1テーブルとしてのt1とt2の間のすべての共通データ。
  2. t1テーブルとしての非t2行ソース。
  3. t2テーブルとしての非t1行ソース。

t2テーブルの共通データが必要な場合は、左結合を反転します

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top