2

2つのテーブル(ストーリーとステータス)があり、それぞれにこれらの共通フィールドがあります

id (unsigned int - auto increment)
creator (unsigned int)
message (varchar)
timestamp (unsigned int)

これらのテーブルをWebページに表示するとき、1つのクエリを使用して、タイムスタンプの順に両方のテーブルから選択したいのですが、表示方法が異なります。

Like(タイムスタンプ順):

SELECT * FROM `stories`, `statuses` WHERE `creator` = 1 ORDER BY `timestamp` DESC LIMIT 0, 10

Row 1: id, creator, message, timestamp, type ("status")
Row 2: id, creator, message, timestamp, type ("story")
Row 3: id, creator, message, timestamp, type ("status")
Row 4: id, creator, message, timestamp, type ("status")
Row 5: etc...

Webページで各行を異なる方法で表示するには、タイプフィールドが必要です。そして、これは各テーブルの単純な形式にすぎません。実際にはもっと複雑ですが、ここから現在のクエリに回答を転送することができます。

ありがとう!

4

2 に答える 2

5

UNION演算子を使用して、2つ以上のSELECTステートメントの結果セットを組み合わせることができます。

SELECT a.id, a.creator, a.message, a.timestamp, 'story' as table_type
FROM stories a
UNION
SELECT b.id, b.creator, b.message, b.timestamp, 'status' as table_type
FROM statuses b
WHERE ( a.creator = 1 ) OR (b.creator = 1)
ORDER BY 'timestamp' DESC LIMIT 0, 10;

UNION演算子は、デフォルトで個別の値のみを選択することに注意してください。重複する値を許可するには、UNIONALLを使用します。

SELECT a.id, a.creator, a.message, a.timestamp, 'story' as table_type
FROM stories a
UNION ALL
SELECT b.id, b.creator, b.message, b.timestamp, 'status' as table_type
FROM statuses b
WHERE ( a.creator = 1 ) OR (b.creator = 1)
ORDER BY 'timestamp' DESC LIMIT 0, 10;

これがお役に立てば幸いです。

于 2012-12-10T04:02:40.300 に答える
0

を使用して、構文JOINと組み合わせてこれを行うことができます。SELECT column AS 'some name'

例えば...

SELECT statuses.somefield AS 'some name' FROM `stories` JOIN(`statuses`) ON (status.id = stories.id) WHERE stories.creator = 1 ORDER BY stories.timestamp DESC LIMIT 0, 10
于 2012-12-10T00:54:52.597 に答える