Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/234.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何创建查询以获得正确的多元结果?_Php_Mysql_Sql_Select - Fatal编程技术网

Php 如何创建查询以获得正确的多元结果?

Php 如何创建查询以获得正确的多元结果?,php,mysql,sql,select,Php,Mysql,Sql,Select,这是我的表格,我需要得到如下结果: 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 ,

这是我的表格,我需要得到如下结果:

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中的单个查询中获取?在这里,我只能提供城市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 

我想这就是你想要的:

SELECT pincode, poi_id, COUNT(1) AS place_cnt
FROM table_name
GROUP BY pincode, poi_id;
您可以使用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
编辑:根据您的评论,您可以获得每个pincode的每个可能poi_id计数的行格式:

其中poi是poi_id链接到的表的名称。确保列名也一致

如果仍然希望每个pincode有一行,可以使用GROUP_CONCAT将所有计数合并到一个分隔字符串中:

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

如果我理解正确,您需要一个resultset,其中每一行都是pincode,后跟每种感兴趣点类型的numver

您指定的目标结果看起来需要是一个长的、自然的英文字符串。我不会让你走那么远,但我会给你一些你可以在代码中使用的东西

以下是您将得到的最终结果:

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
注意:我不认为以这种方式要求结果是理想的。如果以后添加了新类型的兴趣点,则必须重写查询。但既然这是个问题,下面是答案:

有两种方法可以做到这一点,并且都使用对每种类型的兴趣点都计算*的子查询。第一个选项是将子查询嵌入查询的SELECT部分。第二个选项是从子查询生成派生表并将它们连接在一起

以下是选项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

然后在代码中构建单行行。

不,结果不取决于addr,而是取决于poi_id,因为addr是唯一的。。从那以后,我会得到地址是学校还是清真寺…编辑:把地址改成poi_id可能会对你有帮助。地址对我来说并不重要。对我来说,我需要显示一个城市中寺庙、医院、清真寺的数量……这会有所帮助,但问题是在这个表中,我有6500多行,poi_id超过1000。。我想动态地给poi_id…@Pramod,poi_id链接到哪个表?我们可能能够以行格式而不是列格式导出计数。您所要求的是关系数据库。结果集需要有固定数量的列。@ZaneBien great man!,谢谢。这很有效。但现在的问题是,我的表有65000多行,因为该查询需要更多的时间。。我需要为此做点什么。。谢谢啊,选择的答案比我建议的这个牛肚好多了!
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