3

この 2 つのクエリを別々にリストしていましたが、同じリストに結果が必要になりました。

現在、JavaScriptを使用してIDでアイテムを注文することで「修正」しています。しかし、このデータをサーバーからマージして、結果をページングできるようにするとよいでしょう..

データベーススキーマ

テーブル フレンド:

ここに画像の説明を入力

テーブルが役立ちます

ここに画像の説明を入力

クエリ A (現在のユーザーから結果を返す)

   $sql = 'SELECT * FROM helps WHERE id_user ='.$value;

クエリ B (現在のユーザーの友達から結果を返す)

$sql = 'SELECT
    h.*,
    f.* 
    FROM (
            SELECT
                     id  AS friendsId,
                     CASE followerid WHEN '.$value.' THEN followingid ELSE followerid END AS friend_id
                        FROM friends
                        WHERE acepted = 1
                        AND (followerid  = '.$value.' OR followingid = '.$value.')
                    ) AS f
                        INNER JOIN helps AS h ON h.id_user = f.friend_id
                        ORDER BY h.id DESC';

これらのクエリをマージする方法はありますか? 正直なところ、方法がわかりません。

-編集-

ユニオンを考えていますが、モノごとの順番の扱い方がわかりません..

$sql = '(SELECT * FROM helps WHERE id_user = '.$value.')
                    UNION
                    (SELECT
                                h.*,
                                f.* 
                            FROM (
                                SELECT
                                    id  AS friendsId,
                                    CASE followerid WHEN '.$value.' THEN followingid ELSE followerid END AS friend_id
                                FROM friends
                                WHERE acepted = 1
                                AND (followerid  = '.$value.' OR followingid = '.$value.')
                            ) AS f
                                INNER JOIN helps AS h ON h.id_user = f.friend_id
                                ORDER BY h.id DESC)';

2 番目のクエリでわかるように、テーブルの名前が h に変更されました。どうすれば最初に同じことができますか?(どちらのクエリも同じ形式でデータを返します)

4

4 に答える 4

4

これら2つのクエリと注文レコードの結果をマージするには、UNIONALLを。と一緒に使用する必要がありますGROUP BY。このクエリを試してください:

SELECT h.id AS id, h.title, h.content, id_user, h.id_group,
       h.id_type, h.id_lic, h.avatar, h.attached, h.attached,
       h.fetcha, h.likes, h.lan, h.needsCount, h.receivedCount,
       MAX(h.fid) AS fid, MAX(h.friend_id) AS friend_id
FROM (   
      SELECT h.id AS id, h.title, h.content, id_user, h.id_group,
             h.id_type, h.id_lic, h.avatar, h.attached, h.attached,
             h.fetcha, h.likes, h.lan, h.needsCount, h.receivedCount,
             0 AS fid, 0 AS friend_id
      FROM helps h
      WHERE h.id_user ='.$value.'

      UNION ALL

      SELECT h.id, h.title, h.content, id_user, h.id_group,
             h.id_type, h.id_lic, h.avatar, h.attached, h.attached,
             h.fetcha, h.likes, h.lan, h.needsCount, h.receivedCount,
             f.id AS fid, f.friend_id
      FROM (
             SELECT id  AS friendsId,
                    CASE followerid WHEN '.$value.' THEN followingid
                                    ELSE followerid
                    END AS friend_id
             FROM friends
             WHERE acepted = 1
                   AND (followerid  = '.$value.' OR followingid = '.$value.')
            ) AS f
            INNER JOIN helps AS h
                ON h.id_user = f.friend_id
     ) h
GROUP BY h.id
ORDER BY h.id DESC;
于 2012-09-11T13:50:31.030 に答える
1

の基本ルールはUNION

  • 各クエリによって返される列の数は等しくなければならず、
  • データ型は互いに一致する必要があります。

ご覧のとおり、作成したクエリを変更していません。クエリごとに仮想列を追加しただけです。この列は、すべてのレコードの順序付けに使用されます。クエリは別のものによってラップされたselect statmentため、仮想列は結果リストに表示されませんが、レコードの順序付けの基礎になります。以下のクエリの結果には、一番上にユーザーのレコードが含まれており (のためORDER BY OrderBy ASC)、ユーザーの友人のレコードが友人の ID でソートされています。説明が必要な場合は、お知らせください。もう1つ、2番目のクエリで削除f.*しました。これは不要であり、列(番号)が一致しないために構文でエラーが発生する可能性があるためです。

SELECT  ID, Title, Content, ID_User, ID_Group, 
        ID_Type, ID_Loc, Avatar, Attached, Fecha, Likes, 
        Lan, NeedsCount, RecivedCount
FROM
    (
        SELECT *, 1 as OrderBy           -- first query you formulated
        FROM helps 
        WHERE id_user = '.$value.'
        UNION
        SELECT  h.*, 2 as OrderBy        -- second query you formulated
        FROM    (
                    SELECT  id  AS friendsId,
                            CASE followerid 
                                WHEN '.$value.' THEN followingid 
                                ELSE followerid 
                            END AS friend_id
                    FROM    friends
                    WHERE   acepted = 1 AND 
                            (followerid  = '.$value.' OR followingid = '.$value.')
                ) AS f
                    INNER JOIN helps AS h 
                        ON h.id_user = f.friend_id
    ) x
ORDER BY OrderBy ASC, ID DESC
于 2012-09-13T09:19:05.880 に答える
0

Omesh が説明したように UNION を実行し、順序付けを処理するには、次のようにします。

SELECT * FROM
(
    ....Omesh's code....
) T
ORDER BY T.id DESC
于 2012-09-11T15:36:12.680 に答える
0

UNION両方のクエリの結果セットが類似している場合は、演算子を試してください

于 2012-09-09T12:49:36.557 に答える