1

これは、次のような結果を取得するために必要な私のテーブルです。

in 560038 two hospitals, one temple, zero masjid, zero company, one church and 
in 560049 one schools, one masjid, one company, zero temple, zero hospitals, and 
in 562129 one high school, zero hospitals, zero company, zero masjid , zero temple. 

604=hospital,
1306=temple,
1302=church,
204=school,
1305=masjid,
102=company. 

mysqlの単一のクエリから取得することは可能ですか?ここでは、city_idのみを指定できます。

id  |cat_id|poi_id |addr                    |pincode|city_id 
1   |6     |604     |Amrutha  Hospital      |560038 |284 
2   |13    |1306    |Temple             |560038 |284 
3   |13    |1302    |Resurrection Church    |560038 |284 
4   |2     |204     |Lake Montfort School   |560049 |284 
5   |6     |604     |Garden City Hospital   |560038 |284 
6   |13    |1305    |Bilal Masjid           |560049 |284 
7   |1     |102     |Grindwell Limited      |560049 |284 
8   |2     |204     |Citizen High School    |562129 |284 
4

4 に答える 4

1

CASE内の式を使用しCOUNT()て、を条件付きで集計poi_idし、でグループ化されたカウントを区別できますpincode

あなたが欲しい:

SELECT   pincode,
         COUNT(CASE poi_id WHEN 604  THEN 1 END) AS hospital_cnt,
         COUNT(CASE poi_id WHEN 1306 THEN 1 END) AS temple_cnt,
         COUNT(CASE poi_id WHEN 1302 THEN 1 END) AS church_cnt,
         COUNT(CASE poi_id WHEN 204  THEN 1 END) AS school_cnt,
         COUNT(CASE poi_id WHEN 1305 THEN 1 END) AS masjid_cnt,
         COUNT(CASE poi_id WHEN 102  THEN 1 END) AS company_cnt
FROM     tbl
GROUP BY pincode

編集:あなたのコメントに従って、あなたはそれぞれの可能なカウントの行フォーマットを得ることができpoi_idますpincode

SELECT     a.pincode,
           b.poi_id,
           COUNT(c.pincode) AS cnt
FROM       (SELECT DISTINCT pincode FROM tbl) a
CROSS JOIN poi b
LEFT JOIN  tbl c ON a.pincode = c.pincode AND b.poi_id = c.poi_id
GROUP BY   a.pincode, b.poi_id

poiリンク先のテーブルの名前はどこにありますかpoi_id。列名も一貫していることを確認してください。

それでもごとに1行が必要な場合pincodeは、を使用GROUP_CONCATして、カウントをすべて1つの区切られた文字列にまとめることができます。

SELECT   a.pincode,
         GROUP_CONCAT(CONCAT(a.poi_id, ': ', a.cnt) SEPARATOR ' / ') AS poi_cnts
FROM     (
         SELECT     a.pincode,
                    b.poi_id,
                    COUNT(c.pincode) AS cnt
         FROM       (SELECT DISTINCT pincode FROM tbl) a
         CROSS JOIN poi b
         LEFT JOIN  tbl c ON a.pincode = c.pincode AND b.poi_id = c.poi_id
         GROUP BY   a.pincode, b.poi_id
         ) a
GROUP BY a.pincode
于 2012-08-03T10:03:40.947 に答える
0

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

SELECT pincode, poi_id, COUNT(1) AS place_cnt
FROM table_name
GROUP BY pincode, poi_id;
于 2012-08-03T09:32:27.307 に答える
0
select pincode, addr, count(id) from YourTable group by pincode, addr
于 2012-08-03T09:34:13.330 に答える
-1

私が正しく理解している場合は、各行がピンコードの後に​​、関心のある各タイプのポイントの番号が続く結果セットが必要です。

指定したターゲット結果は、長くて自然な英語の文字列である必要があるように見えます。ここまでは説明しませんが、コードで使用できるものを提供します。

最終的な結果は次のとおりです。

pincode | hospitals | temples | masjids | companies | churches | schools
560038  |     2     |    1    |    0    |     0     |    1     |    0
560049  |     0     |    0    |    1    |     1     |    0     |    1
562129  |     0     |    0    |    0    |     0     |    0     |    1

注:この方法で結果を要求することは理想的ではないと思います。後で新しいタイプの関心のあるポイントが追加された場合は、クエリを書き直す必要があります。しかし、これが質問なので、ここに答えがあります:

これを行うには2つの方法があり、どちらも対象のポイントのタイプごとにcount(*)を実行するサブクエリを使用します。最初のオプションは、クエリのSELECT部分​​にサブクエリを埋め込むことです。2番目のオプションは、サブクエリから派生テーブルを作成し、それらを結合することです。

オプション1は次のとおりです。

SELECT
mainTbl.pincode,
(SELECT count(*) FROM myTable WHERE pincode = mainTbl.pincode AND city_id = mainTbl.city_id AND poi_id = 604) as hospitals,
(SELECT count(*) FROM myTable WHERE pincode = mainTbl.pincode AND city_id = mainTbl.city_id AND poi_id = 1306) as temples,
(SELECT count(*) FROM myTable WHERE pincode = mainTbl.pincode AND city_id = mainTbl.city_id AND poi_id = 1305) as masjids,
(SELECT count(*) FROM myTable WHERE pincode = mainTbl.pincode AND city_id = mainTbl.city_id AND poi_id = 1302) as churches,
(SELECT count(*) FROM myTable WHERE pincode = mainTbl.pincode AND city_id = mainTbl.city_id AND poi_id = 204) as schools,
(SELECT count(*) FROM myTable WHERE pincode = mainTbl.pincode AND city_id = mainTbl.city_id AND poi_id = 102) as companies
FROM myTable mainTbl
WHERE mainTbl.city_id = ?

そしてオプション2:

SELECT
mainTbl.pincode,
hospitalsTbl.hospitals,
templesTbl.temples,
masjidsTbl.masjids,
churchesTbl.churches,
schoolsTbl.schools,
companiesTbl.companies

FROM myTable mainTbl
JOIN (SELECT count(*) as hospitals, pincode FROM myTable WHERE pincode = mainTbl.pincode AND city_id = mainTbl.city_id  AND poi_id = 604) hospitalsTbl ON hospitalsTbl.pincode = mainTbl.pincode
JOIN (SELECT count(*) as temples, pincode FROM myTable WHERE pincode = mainTbl.pincode AND city_id = mainTbl.city_id AND poi_id = 1306) templesTbl ON templesTbl.pincode = mainTbl.pincode
JOIN (SELECT count(*) as masjids, pincode FROM myTable WHERE pincode = mainTbl.pincode AND city_id = mainTbl.city_id AND poi_id = 1305) masjidsTbl ON masjidsTbl.pincode = mainTbl.pincode
JOIN (SELECT count(*) as churches, pincode FROM myTable WHERE pincode = mainTbl.pincode AND city_id = mainTbl.city_id AND poi_id = 1302) churchesTbl ON churchesTbl.pincode = mainTbl.pincode
JOIN (SELECT count(*) as schools, pincode FROM myTable WHERE pincode = mainTbl.pincode AND city_id = mainTbl.city_id AND poi_id = 204) schoolsTbl ON schoolsTbl.pincode = mainTbl.pincode
JOIN (SELECT count(*) as companies, pincode FROM myTable WHERE pincode = mainTbl.pincode AND city_id = mainTbl.city_id AND poi_id = 102) companiesTbl ON companiesTbl.pincode = mainTbl.pincode
WHERE mainTbl.city_id = ?

ご覧のとおり、クエリは非常に冗長です。このようなものを持っている方がはるかに良いです:

SELECT count(*) as num_poi, poi_id, pincode
FROM myTable
WHERE city_id = ?
GROUP BY poi_id, pincode

次に、コードで1行の行を作成します。

于 2012-08-03T10:15:55.070 に答える