Mysql 其他2结束,回顾总说明,住宿。标题 限制10偏移0
编辑: 您仍然可以使用自己的方式加入Mysql 其他2结束,回顾总说明,住宿。标题 限制10偏移0,mysql,performance,sum,inner-join,Mysql,Performance,Sum,Inner Join,编辑: 您仍然可以使用自己的方式加入 SELECT accomodation.id, accomodation.aid, accomodation.title_en, accomodation.title_url_en, accomodation.address, accomodation.zip, accomodation.stars, accomodation.picture, accomodation.valid_from, accomodation
SELECT
accomodation.id,
accomodation.aid,
accomodation.title_en,
accomodation.title_url_en,
accomodation.address,
accomodation.zip,
accomodation.stars,
accomodation.picture,
accomodation.valid_from,
accomodation.valid_to,
accomodation.latitude,
accomodation.longitude,
MAX(info_date_add) AS max_info_date_add,
accomodation.city_id AS accomodation_city_id,
db_cities.id AS city_id,
db_cities.title_en AS city,
db_cities.title_url AS city_url,
db_countries.title_en AS country_title,
db_countries.title_url_en AS country_url,
accomodation_type.class AS accomodation_type_class,
accomodation_review_value_total.value AS review_total,
MIN(accomodation_price.price) AS price_from,
accomodation_rooms.total_persons,
SUM(IFNULL(accomodation_rooms.rooms,0,1)) AS total_rooms,
SUM(IFNULL(accomodation_rooms.beds * accomodation_rooms.rooms,0,1)) AS total_persons
FROM accomodation
LEFT JOIN db_cities
ON db_cities.id = accomodation.city_id
LEFT JOIN db_countries
ON (db_cities.id = accomodation.city_id
OR (((acos(sin((db_cities.latitude * pi()/180)) * sin((accomodation.latitude * pi()/180)) + cos((db_cities.latitude * pi()/180)) * cos((accomodation.latitude * pi()/180)) * cos(((db_cities.longitude - accomodation.longitude) * pi()/180)))) * 180/pi()) * 60 * 1.1515 * 1.609344) < '20')
LEFT JOIN accomodation_review_value_total
ON accomodation_review_value_total.accomodation_aid = accomodation.aid
LEFT JOIN accomodation_price
ON (accomodation_price.accomodation_aid = accomodation.aid
AND accomodation_price.accomodation_price_type_id = '1'
AND accomodation_price.accomodation_price_cat_id = '1')
LEFT JOIN accomodation_rooms
ON accomodation_rooms.accomodation_id = accomodation.id
WHERE db_countries.title_url_en LIKE '%country%'
AND db_cities.title_url LIKE '%city%'
AND total_rooms >= '2'
AND db_cities.id = '2416'
GROUP BY accomodation.aid
HAVING accomodation_rooms.total_persons >= '4'
ORDER BY CASE WHEN accomodation.valid_to >= NOW()
AND accomodation.valid_from <= NOW()THEN 0 WHEN NOW() > accomodation.valid_to
AND accomodation.valid_to != '0000-00-00'THEN 1 ELSE 2 END, review_total DESC, accomodation.title_en
LIMIT 10 OFFSET 0
选择
住宿id,
住宿,
住宿,
住宿。头衔,
住宿地址,
acomodation.zip,
住宿,
住宿,
住宿有效期从,
住宿,
住宿纬度,
经度,
最大值(信息日期添加)作为最大值信息日期添加,
住宿城市id作为住宿城市id,
db_cities.id作为city_id,
db_cities.title_en AS city,
db_cities.title_url作为city_url,
db_countries.title_en作为国家名称,
db_countries.title_url_en作为国家url,
住宿类作为住宿类,
住宿\审核\价值\总额。价值作为审核\总额,
最低(住宿价格)作为价格来源,
住宿房间。总人数,
总计(如果为空(住宿房间,0,1))作为总房间,
总计(如果为空(住宿房间.床位*住宿房间.房间,0,1))为总人数
住宿费
左连接db_城市
关于db_cities.id=住宿.city_id
左加入db_国家/地区
ON(db_cities.id=住宿.city_id
或者((acos(sin((db_cities.latitude*pi()/180))*sin((acodation.latitude*pi()/180))+cos((db_cities.latitude*pi()/180))*cos((db_cities.longitude-acodation.longitude)*/180))*180/pi()*60*1.1515*1.609344<'20')
左连接住宿\审核\价值\总计
关于住宿(审查)(价值)(总计)住宿(援助)=住宿(援助)
左连接住宿价格
ON(住宿价格。住宿辅助=住宿辅助
和住宿价格。住宿价格类型id='1'
和住宿价格。住宿价格类别id='1')
左连接住宿房间
关于住宿房间。住宿id=住宿id
其中db_countries.title_url_en类似于“%country%”
和db_cities.title_url,如“%city%”
和总房间数>='2'
和db_cities.id='2416'
按住宿分组
有住宿房间。总人数>='4'
当acomodation.valid_to>=NOW()时按情况订购
和住宿。有效从住宿。有效到
和住宿。有效到!='0000-00-00'然后1个其他2个结束,检查总说明,住宿。标题
限制10偏移0
这里的一点是,你可以使用左连接而不是内连接,我认为这会更快。在HAVAING子句中填入where条件。另请注意,我正在应用IF条件,同时选择so,如果为null,则总和为0,否则为1。请发布您的完整查询,而不是您想要的部分:)检查我的postrun解释并发布结果:
解释选择accomodation\u id,总和(accomodation\u rooms.rooms)作为房间总数,总和(住宿房间。床*住宿房间。房间)按accomodation_id作为accomodation_rooms组的总人数
你有关于accomodation_id和rooms的索引吗?嗯,如果我添加解释,说明:你的SQL语法有错误;检查与你的MySQL服务器版本对应的手册,了解使用“EXPLAIN SELECT accomodation_id,SUM(accomodation_rooms.rooms)”附近的正确语法至于“嗯,当我选择“计算”然后使用“拥有”时,它看起来真的更快。但我还有一个问题。我如何修改它以同时显示结果,它没有指定的纬度和经度,因此计算不可用?在我的选择中,有两个关于加入db_城市的条件-按ID或按距离你可以设置一个or条件having子句中。having Calculation<20或Calculation为NULL
。我猜只有在计算不可用时才会出现NULL。ok它正在工作,但我没有注意到另一个问题…现在它只在id上连接表db_cities,但我还需要按距离范围连接城市…嗯,好的,但这并不快…问题仍然在INNE中R与SUM连用-我认为SUM是problem@general666查看我修改的第二个查询。尝试并告诉它是否更快。这个查询应该是什么?它是对原始问题的回答吗?简短的描述很好,可以让它对其他人有用。
SELECT
accomodation.id,
accomodation.aid,
accomodation.title_en,
accomodation.title_url_en,
accomodation.address,
accomodation.zip,
accomodation.stars,
accomodation.picture,
accomodation.valid_from,
accomodation.valid_to,
accomodation.latitude,
accomodation.longitude,
accomodation.city_id AS accomodation_city_id,
db_cities.id AS city_id,
db_cities.title_en AS city,
db_cities.title_url AS city_url,
db_countries.title_en AS country_title,
db_countries.title_url_en AS country_url,
accomodation_type.class AS accomodation_type_class,
accomodation_review_value_total.value AS review_total,
MIN(accomodation_price.price) AS price_from,
accomodation_rooms.total_persons
FROM
(SELECT aid, MAX(info_date_add) AS max_info_date_add FROM accomodation GROUP BY aid) accomodation_max
INNER JOIN accomodation
ON
accomodation_max.aid = accomodation.aid AND
accomodation_max.max_info_date_add = accomodation.info_date_add
LEFT JOIN db_cities
ON
( db_cities.id = accomodation.city_id OR (((acos(sin((db_cities.latitude*pi()/180)) * sin((accomodation.latitude*pi()/180)) + cos((db_cities.latitude*pi()/180)) * cos((accomodation.latitude*pi()/180)) * cos(((db_cities.longitude - accomodation.longitude)*pi()/180))))*180/pi())*60*1.1515*1.609344) < '20')
JOIN db_countries
ON db_countries.id = accomodation.country_id
LEFT JOIN accomodation_review_value_total
ON accomodation_review_value_total.accomodation_aid = accomodation.aid
LEFT JOIN accomodation_type_value
ON accomodation_type_value.accomodation_id = accomodation.id
LEFT JOIN accomodation_type
ON accomodation_type.id = accomodation_type_value.accomodation_type_id
LEFT JOIN accomodation_price
ON
( accomodation_price.accomodation_aid = accomodation.aid AND
accomodation_price.accomodation_price_type_id = '1' AND
accomodation_price.accomodation_price_cat_id = '1' )
LEFT JOIN accomodation_season
ON
( accomodation_season.accomodation_aid = accomodation.aid AND
accomodation_season.id = accomodation_price.accomodation_season_id AND
( '2013-09-25' >= accomodation_season.start_date AND
accomodation_season.end_date >= '2013-09-25' OR '2013-09-26' >= accomodation_season.start_date AND
accomodation_season.end_date >= '2013-09-26' ) )
INNER JOIN
(SELECT accomodation_id, SUM(accomodation_rooms.rooms) AS total_rooms,
SUM(accomodation_rooms.beds * accomodation_rooms.rooms) AS total_persons
FROM accomodation_rooms
GROUP BY accomodation_id) accomodation_rooms
ON
accomodation_rooms.accomodation_id = accomodation.id AND
accomodation_rooms.total_persons >= '4'
WHERE
db_countries.title_url_en LIKE '%country%' AND
db_cities.title_url LIKE '%city%' AND
total_rooms >= '2' AND
db_cities.id = '2416'
GROUP BY accomodation.aid
ORDER BY CASE
WHEN
accomodation.valid_to>=NOW() AND
accomodation.valid_from<=NOW() THEN 0
WHEN
NOW()>accomodation.valid_to AND
accomodation.valid_to!='0000-00-00' THEN 1 ELSE 2 END,
review_total DESC, accomodation.title_en LIMIT 10 OFFSET 0
SELECT
accomodation.id,
accomodation.aid,
accomodation.title_en,
accomodation.title_url_en,
accomodation.address,
accomodation.zip,
accomodation.stars,
accomodation.picture,
accomodation.valid_from,
accomodation.valid_to,
accomodation.latitude,
accomodation.longitude,
MAX(info_date_add) AS max_info_date_add,
accomodation.city_id AS accomodation_city_id,
db_cities.id AS city_id,
db_cities.title_en AS city,
db_cities.title_url AS city_url,
db_countries.title_en AS country_title,
db_countries.title_url_en AS country_url,
accomodation_type.class AS accomodation_type_class,
accomodation_review_value_total.value AS review_total,
MIN(accomodation_price.price) AS price_from,
accomodation_rooms.total_persons,
(((acos(sin((db_cities.latitude * pi()/180)) * sin((accomodation.latitude * pi()/180)) + cos((db_cities.latitude * pi()/180)) * cos((accomodation.latitude * pi()/180)) * cos(((db_cities.longitude - accomodation.longitude) * pi()/180)))) * 180/pi()) * 60 * 1.1515 * 1.609344) as Calculation
FROM accomodation
LEFT JOIN db_cities ON db_cities.id = accomodation.city_id
LEFT JOIN db_countries ON db_countries.id = accomodation.country_id
LEFT JOIN accomodation_review_value_total ON accomodation_review_value_total.accomodation_aid = accomodation.aid
LEFT JOIN accomodation_price ON (accomodation_price.accomodation_aid = accomodation.aid AND accomodation_price.accomodation_price_type_id = '1' AND accomodation_price.accomodation_price_cat_id = '1')
INNER JOIN (SELECT
accomodation_id,
SUM(accomodation_rooms.rooms) AS total_rooms,
SUM(accomodation_rooms.beds * accomodation_rooms.rooms) AS total_persons
FROM accomodation_rooms
GROUP BY accomodation_id) accomodation_rooms
ON accomodation_rooms.accomodation_id = accomodation.id
AND accomodation_rooms.total_persons >= '4'
WHERE db_countries.title_url_en LIKE '%country%'
AND db_cities.title_url LIKE '%city%'
AND total_rooms >= '2'
AND db_cities.id = '2416'
GROUP BY accomodation.aid
HAVING Calculation < 20
ORDER BY CASE WHEN accomodation.valid_to >= NOW()
AND accomodation.valid_from <= NOW()THEN 0 WHEN NOW() > accomodation.valid_to
AND accomodation.valid_to != '0000-00-00'THEN 1 ELSE 2 END, review_total DESC, accomodation.title_en
LIMIT 10 OFFSET 0
SELECT
accomodation.id,
accomodation.aid,
accomodation.title_en,
accomodation.title_url_en,
accomodation.address,
accomodation.zip,
accomodation.stars,
accomodation.picture,
accomodation.valid_from,
accomodation.valid_to,
accomodation.latitude,
accomodation.longitude,
MAX(info_date_add) AS max_info_date_add,
accomodation.city_id AS accomodation_city_id,
db_cities.id AS city_id,
db_cities.title_en AS city,
db_cities.title_url AS city_url,
db_countries.title_en AS country_title,
db_countries.title_url_en AS country_url,
accomodation_type.class AS accomodation_type_class,
accomodation_review_value_total.value AS review_total,
MIN(accomodation_price.price) AS price_from,
accomodation_rooms.total_persons,
SUM(IFNULL(accomodation_rooms.rooms,0,1)) AS total_rooms,
SUM(IFNULL(accomodation_rooms.beds * accomodation_rooms.rooms,0,1)) AS total_persons
FROM accomodation
LEFT JOIN db_cities
ON db_cities.id = accomodation.city_id
LEFT JOIN db_countries
ON (db_cities.id = accomodation.city_id
OR (((acos(sin((db_cities.latitude * pi()/180)) * sin((accomodation.latitude * pi()/180)) + cos((db_cities.latitude * pi()/180)) * cos((accomodation.latitude * pi()/180)) * cos(((db_cities.longitude - accomodation.longitude) * pi()/180)))) * 180/pi()) * 60 * 1.1515 * 1.609344) < '20')
LEFT JOIN accomodation_review_value_total
ON accomodation_review_value_total.accomodation_aid = accomodation.aid
LEFT JOIN accomodation_price
ON (accomodation_price.accomodation_aid = accomodation.aid
AND accomodation_price.accomodation_price_type_id = '1'
AND accomodation_price.accomodation_price_cat_id = '1')
LEFT JOIN accomodation_rooms
ON accomodation_rooms.accomodation_id = accomodation.id
WHERE db_countries.title_url_en LIKE '%country%'
AND db_cities.title_url LIKE '%city%'
AND total_rooms >= '2'
AND db_cities.id = '2416'
GROUP BY accomodation.aid
HAVING accomodation_rooms.total_persons >= '4'
ORDER BY CASE WHEN accomodation.valid_to >= NOW()
AND accomodation.valid_from <= NOW()THEN 0 WHEN NOW() > accomodation.valid_to
AND accomodation.valid_to != '0000-00-00'THEN 1 ELSE 2 END, review_total DESC, accomodation.title_en
LIMIT 10 OFFSET 0