1

Facebookの通知ウィンドウに似た機能を作ろうとしています。それらの機能は、あらゆる種類のイベントを組み合わせて、日付の後にそれらを表示するようです。

だから私は2つのテーブルを持っています:記事とコメント。どちらにも2つの類似した行があります:uniquepostownerとdate_posted。

一緒に並べて表示したいです。例 :

User A has posted a comment (04.05.2012 5:30)
User B Has posted a comment (04.05.2012 6:30)
User C has written an article (04.05.2012 7:30)
user D has posted a comment (04.05.2012 8:30)

しかし、私はこれら2つを結合し、結果を表示することの両方に苦労しています。同様のシナリオで他の人を読んで、これをクエリとして試しました。

$sesid = $_SESSION['user_id'];
$sql = "SELECT X.* FROM ( SELECT * FROM `article` WHERE uniquepostowner = {$sesid} UNION SELECT * FROM `comments`  WHERE uniquepostowner  = {$sesid} ) X ORDER BY X.`date_posted`";
$result = mysql_query($sql);

次に、次のような結果を取得しようとします。

while($row = mysql_fetch_array($result))
{
echo $row['article.id'];
 }   

テーブル:

**article**:
id
title
content
uniqueuser
date_posted
full_name
uniquepostowner

**comments**:
id 
pid (same as article.id)
date_posted
content
full_name
uniquepostowner

これらのテーブルにはさらに多くの行がありますが、それらは無関係です。しかし、成功しません。いつものようにどんな助けでも大歓迎です!:)

現在私はこれを試していますが、私が望むことをしていません。

$sql = "SELECT * FROM article a INNER JOIN comments c WHERE a.uniquepostowner = {$sesid} AND c.uniquepostowner = {$sesid} 
ORDER BY a.date_posted DESC , c.date_posted DESC ";
4

4 に答える 4

3

私はこれがあなたが必要としているものだと思います:

更新しました:

$sesid = $_SESSION['user_id'];
$sql = "
SELECT 
    X . *
FROM
    (SELECT 
        id,
        date_posted,
        content,
        full_name,
        uniquepostowner,
        'article' AS type
    FROM
        article
    WHERE
        uniquepostowner = {$sesid} UNION SELECT 
        id,
        date_posted,
        content,
        full_name,
        uniquepostowner,
        'comment' AS type
    FROM
        comments
    WHERE
        uniquepostowner = {$sesid}) X
ORDER BY X.date_posted
";
$result = mysql_query($sql);

そして、次のように繰り返すことができます。

while($row = mysql_fetch_array($result))
{
        if($row['type']=='article'){
            echo "User " . $row['full_name'] . " has written an article (".$row['date_posted'].")<br>";
        } else {
            echo "User " . $row['full_name'] . " has posted a comment (".$row['date_posted'].")<br>";
        }
}

あなたはそれをチェックアウトすることができます:

http://sqlfiddle.com/#!2/38778/8

于 2012-07-13T12:51:10.457 に答える
2

両方のテーブルに共通する列のみを使用するようにSQLを言い換える必要があります。

SELECT uniquepostowner,date_posted FROM `article` WHERE uniquepostowner = {$sesid} 
UNION 
SELECT uniquepostowner,date_posted FROM `comments` WHERE uniquepostowner  = {$sesid} 
ORDER BY date_posted

mysqlマニュアルにはさらにいくつかの例があります。

于 2012-07-13T12:24:46.657 に答える
0

たぶん私は要点を見逃していますが、これは問題を解決しません:

SELECT  articles.*, comments.* FROM  articles, comments WHERE articles.uniqueuserid = $userId AND comments.postId = articles.Id ORDER BY articles.date_published DESC

多くの場合、すべてのテーブル名とフィールド名は、コードに合わせて調整する必要があります。基本的には、uniquepostownerまたはあなたの名前が何であれ、対応するコメントが公開日でソートされたすべての記事をロードします。

これはあなたが求めているものですか?

編集 実際には、コメントや記事は槍であり、それらを並べて表示したいですか?その場合は、日付、所有者、タイプ(article / comment / like / photo / anything)、対応するアイテムのIDを保持する「events」テーブルを作成し、それを使用してフィードを生成してみませんか?

于 2012-07-13T12:25:09.040 に答える
0

ユニオンの各クエリの列を等しくする必要があります。

SELECT X.* FROM ( SELECT **uniquepostowner** FROM `article` WHERE uniquepostowner = {$sesid} UNION SELECT **uniquepostowner** FROM `comments`  WHERE uniquepostowner  = {$sesid} ) X ORDER BY X.`date_posted`

これは単なる例であり、ユニオンでは、両方のクエリが同じ量のフィールドを返す必要があります。両方のテーブルが共通に持つfildのみを返すことをお勧めします。

于 2012-07-13T12:28:19.633 に答える