0

2つのテーブルとORDERBY日付(両方にある列)からSELECTしようとしています。1つのテーブル(tableA)には「A」という列があり、もう1つのテーブル(tableB)には「B」という列があります。array_key_exists()を使用して2つを区別します(「A」キーが存在する場合は、配列を実行します。 FunctionA()、「B」キーが存在する場合は、FunctionB()を介して配列を実行します。必要なのは、最新の(日付ごとの)20個のエントリだけです。これを実現するにはSQLクエリが必要です。

「同じように構造化されている場合は、単一のテーブルを使用する必要があります」という返信があることはすでに知っていますが、tableAはtableB(tableAの列がはるかに多い)とは大幅に異なるため、これは行いたくありません。また、単一のテーブルを使用してデータを格納すると、tableB用にフォーマットされたエントリの空の列が大量に発生します。tableBはtableAの列の大部分を必要としないため、非常に見栄えの悪いテーブルフォーマットになることは言うまでもありません。

両方のテーブルのデータを順序付けられた(日付順)方法で、1つの単一のストリームで表示したいだけです。

ちなみに、WHERE tableA.poster_id =$idとtableB.receiver_id=$idを選択する必要があります。

解決:

同じジレンマを持つ他の誰かがやってきた場合に備えて、これを更新しています。@Erik A. Brandstadmoenが丁寧にくれたSQLクエリを実装した後、これは基本的に私のコードが次のようになってしまったものです。

$MySQL->SQL("SELECT * FROM
              (SELECT A.id AS id, A.date AS date, 'tableA' AS source 
                 FROM tableA A WHERE A.poster_id = $id 
                    UNION
                      SELECT B.id AS id, B.date AS date, 'tableB' AS source
                           FROM tableB B WHERE B.receiver_id = $id) AS T
                               ORDER BY T.date DESC LIMIT 0, 20");

$GetStream = array();
$i = 0;
while ($row = mysql_fetch_array($MySQL->Result))
{
    $GetStream[$i]['id'] = $row['id'];
    $GetStream[$i]['date']=$row['date'];
    $GetStream[$i]['source'] = $row['source'];
    $i++;
}

*** later on down the code ***

$i = 0;
while ($i<count($GetStream))
{
    if ($GetStream[$i]['source'] == "tableA")
    { 
        FunctionA($GetStream[$i]);
    }
    else
    {
        FunctionB($GetStream[$i]);
    }
    $i++;
}
4

1 に答える 1

2

使用してみてくださいUNION

SELECT * FROM (
SELECT A.col1 AS x, A.col2 As y, A.col3 AS date FROM tableA A
WHERE tableA.poster_id = $id
UNION 
SELECT B.colA AS x, B.colB AS y, B.colC AS date FROM  tableB B
WHERE tableB.receiver_id = $id
)
ORDER BY date DESC
LIMIT 0, 20

または、tableAとtableBの間で重複を保持する場合は、UNION ALL代わりにを使用します。

編集、あなたのコメントによると、行がどのテーブルからのものであるかを示す列が必要であることを理解しています。次のように、selectに静的列を追加するだけです。

SELECT * FROM (
SELECT A.col1 AS x, A.col2 As y, A.col3 AS date, 'A' as source FROM tableA A
WHERE tableA.poster_id = $id
UNION 
SELECT B.colA AS x, B.colB AS y, B.colC AS date, 'B' as source FROM  tableB B
WHERE tableB.receiver_id = $id
)
ORDER BY date DESC
LIMIT 0, 20

これにより、次の形式の優れたテーブルが得られます。

x    y    date    source
=========================
(v1) (v2) (d1)    'A'
(v3) (v4) (d2)    'B'
(v1) (v2) (d3)    'B'
(v3) (v4) (d4)    'A'

それはあなたが望むことをしますね?これで実際に何を達成しようとしているのかを理解するのは少し難しいです...

于 2011-08-17T18:00:41.727 に答える