2011-11-07 9 views
0
私は3つのクエリで自分のサイト上のデータにアクセスしてい

は、最初のクエリは、サイト上で利用できる取引の完全なリストを取得します。参加MySQLのサブクエリ

$listingquery = "SELECT * FROM table WHERE city = '$city' AND approved = '1' 
    AND enddate > NOW() ORDER BY id DESC"; 

次のクエリが利用できる契約プロバイダの数/リストを取得します。

$providerquery = "SELECT programname, category, COUNT(name) FROM table WHERE 
    city = '$city' AND approved='1' AND enddate > NOW() GROUP BY provider"; 

及び第三クエリその都市で利用可能な契約プロバイダからカテゴリのカウント/リストを取得します。

$categoryquery = "SELECT programname, category, COUNT(name) FROM table WHERE 
    city = '$city' AND approved='1' AND enddate > NOW() GROUP BY category"; 

は、1つのクエリにすべてを組み合わせる方法はありますか?

ありがとうございます!

+0

2番目のクエリについて面白いことがあります: 'category'の代わりに' provider'カラムを選択したのですか?また、2番目または3番目のクエリの 'programname'でグループ化していません。 MySQLはこれを許可しますが、各プロバイダ/カテゴリが1つのプログラム名しか持たないことが保証されていない限り、ランダムな結果を返す可能性があります。 –

+0

ああ、それは一度に15のことをしようとしていたようなタイプミスでした。プログラム名 – Mike

答えて

0

あなたは、いくつかのロスレス情報を得るかもしれないが、あなたは、この試すことができます:私はこのすべてが可能であることを疑う

SELECT * FROM table a 
    LEFT JOIN (
    SELECT programname, category, COUNT(name) 
    FROM table 
    WHERE enddate > NOW() GROUP BY provider 
) b ON a.provider = b.provider 
    LEFT JOIN (
    SELECT programname, category, COUNT(name) 
    FROM table 
    WHERE enddate > NOW() GROUP BY category 
) c ON a.category = b.category 
    WHERE a.city = '$city' AND a.approved = '1' 
    AND a.enddate > NOW() 
    AND b.city = a.city AND c.city = a.city 
    AND b.approved = a.approved AND c.approved = a.approved 
    ORDER BY a.id DESC; 
+0

でグループ化して、WHERE変数は一度しか定義されていない場所に参加できます。私には重複しているようです。私はまだこれに新しいので、物事を行う正しい方法をできるだけ早く学ぶことを試みています。 – Mike

+0

@Mike one second – Neal

+0

@Mike私の最新の更新は**できないかもしれません**。しかし、いくつかの面では正しいです – Neal

0

/:句(やや)1で

SELECT * FROM table a 
    LEFT JOIN (
    SELECT programname, category, COUNT(name) 
    FROM table 
    WHERE city = '$city' AND approved='1' AND enddate > NOW() GROUP BY provider 
) b ON a.provider = b.provider 
    LEFT JOIN (
    SELECT programname, category, COUNT(name) 
    FROM table 
    WHERE city = '$city' AND approved='1' AND enddate > NOW() GROUP BY category 
) c ON a.category = b.category 
    WHERE a.city = '$city' AND a.approved = '1' 
    AND a.enddate > NOW() 
    ORDER BY a.id DESC; 

更新単一のクエリで実行可能ですが、いずれかの方法でMySQLでサブクエリを使用しないでください。パフォーマンスが大幅に低下します。サブクエリの代わりに結合を使用する。

+0

私の用語はオフだと思う。ニールズの答えは、私の使用のために最も論理的であるように思えます。ただ今すぐ動作させようとしています:) – Mike

+0

あなたのソリューションがあれば@マイケル幸運。 –