1

私はこのテーブルを持っています:

id  | id_user  |  id_user_stalkers | date
0   |  0222222 |  032332         | 32234234

だから、友達リストに載っているすべてのユーザーの数と、友達リストに私を入れているすべてのユーザーの数を知りたいのです。現時点では、私はこのクエリを実行しました:

SELECT (
                    SELECT COUNT(id_user)
                    FROM   stalkers WHERE id_user =  ".$id."
                    ) AS user_stalkers,
                    (
                    SELECT COUNT(id_user_stalkers)
                    FROM   stalkers WHERE id_user_stalkers = ".$id."
                    ) AS user_is_stalked
            FROM stalkers  

しかし、これを返します:

Array
(
    [0] => Array
        (
            [user_stalkers] => 7
            [user_is_stalked] => 2
        )

    [1] => Array
        (
            [user_stalkers] => 7
            [user_is_stalked] => 2
        )

    [2] => Array
        (
            [user_stalkers] => 7
            [user_is_stalked] => 2
        )

    [3] => Array
        (
            [user_stalkers] => 7
            [user_is_stalked] => 2
        ))

大丈夫ですが、必要なのは4行ではなく1行だけです。

誰かが私を助けてくれますか?

4

5 に答える 5

1

すべてのフィールドはサブクエリであるため、from句を完全に削除できます。それ以外の場合は、テーブル内のすべての行に対してサブクエリを取得します。これにより、必要な結果が得られるだけでなく、データベースへの総ヒット数が非常に大きくなる可能性があります(パフォーマンスが向上します)。

SELECT 
(
 SELECT COUNT(id_user)
 FROM   stalkers WHERE id_user =  ".$id."
) AS user_stalkers,
(
 SELECT COUNT(id_user_stalkers)
 FROM   stalkers WHERE id_user_stalkers = ".$id."
) AS user_is_stalked

これが潜在的に大きなテーブルになる場合は、id_userとid_user_stalkersの両方にインデックスが付けられていることを確認する必要があります。インデックスを使用できる場合、これらのサブクエリははるかに高速になります。

于 2012-10-24T18:55:37.120 に答える
0

以下のように、明確なwhere句をもう1つ追加する必要があります。

SELECT DISTINCT (
                    SELECT COUNT(id_user)
                    FROM   stalkers WHERE id_user =  ".$id."
                    ) AS user_stalkers,
                    (
                    SELECT COUNT(id_user_stalkers)
                    FROM   stalkers WHERE id_user_stalkers = ".$id."
                    ) AS user_is_stalked
FROM stalkers  
WHERE id_user_stalkers = ".$id."
于 2012-10-24T18:53:43.267 に答える
0

任意のデータベースに対してこのクエリを設定する安全な方法は、cross join:を使用することです。

SELECT user_stalkers, user_is_stalked
from (SELECT COUNT(id_user) as user_stalkers
      FROM   stalkers WHERE id_user =  ".$id."
     ) t1 cross join
     (SELECT COUNT(id_user_stalkers) as user_is_stalked
      FROM   stalkers WHERE id_user_stalkers = ".$id."
     )  t2

Stalkersがあるため、クエリはの行ごとに1行を返します。FROM

于 2012-10-24T18:54:29.567 に答える
0
         SELECT (
                SELECT COUNT(id_user)
                FROM   stalkers WHERE id_user =  ".$id."
                ) AS user_stalkers,
                (
                SELECT COUNT(id_user_stalkers)
                FROM   stalkers WHERE id_user_stalkers = ".$id."
                ) AS user_is_stalked

最後の「FROMストーカー」を削除するだけです

于 2012-10-24T18:54:31.427 に答える
0

これを試してください(2回クエリを実行する必要はなく、個別のことなどを心配する必要はありません)

SELECT COUNT(case when id_user =  ".$id." then 1 else null) AS user_stalkers,
COUNT(case when id_user_stalkers =  ".$id." then 1 else null) AS user_is_stalked
FROM   stalkers
于 2012-10-24T18:59:06.087 に答える