- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有很多表,从我正在做选择的地方,但我只会写重要的部分。我有 2 张 table
住宿:
id | title | desc | etc..
住宿房间:
id | accomodation_id | beds | rooms
然后我一直在选择哪个效果好,直到我想过滤,有多少床(床*房间)有住宿。如果我尝试使用乘法从表 accomodation_rooms 中进行简单选择,效果很好。所以问题应该出在我加入其他表的地方。
这是我的选择:
SELECT
accomodation.*,
db_cities.title_en AS city,
db_cities.title_url AS city_url,
db_countries.title_url_en AS country_url,
SUM(accomodation_rooms.beds * accomodation_rooms.rooms) AS total_persons
FROM
(SELECT id, aid, title_en, title_url_en, address, city_id, zip, district_id, province_id, region_id, country_id, mountain_id, stars, latitude, longitude, picture, valid_from, valid_to
FROM accomodation
ORDER BY info_date_add DESC)
AS accomodation
LEFT JOIN db_cities
ON db_cities.id = accomodation.city_id
JOIN db_countries
ON db_countries.id = accomodation.country_id
JOIN skiresort_locations
ON
(((acos(sin((skiresort_locations.latitude*pi()/180)) *
sin((accomodation.latitude*pi()/180)) +
cos((skiresort_locations.latitude*pi()/180)) *
cos((accomodation.latitude*pi()/180)) *
cos(((skiresort_locations.longitude -
accomodation.longitude)*
pi()/180))))*180/pi())*60*1.1515*1.609344)
< '50'
JOIN accomodation_rooms
ON accomodation_rooms.accomodation_id = accomodation.id
WHERE
db_countries.title_url_en LIKE '%country_title%' AND
accomodation.region_id = '8'
GROUP BY
accomodation.aid
HAVING
total_persons >= '1'
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,
accomodation.title_en
LIMIT 10
OFFSET 0
total_persons 应返回 13但它返回 624,但我真的不明白为什么?
最佳答案
认为您想要的数量可能最好通过使用子选择来获得。
我假设 accomodation_rooms 是一个表,它存储某些住宿的多行,说明该位置有多少张床(即 1 x 5 床房间、2 x 3 床房间、5 x 2 床房间)。
SELECT
accomodation.*,
db_cities.title_en AS city,
db_cities.title_url AS city_url,
db_countries.title_url_en AS country_url,
accomodation_rooms.total_persons
FROM
(SELECT id, aid, title_en, title_url_en, address, city_id, zip, district_id, province_id, region_id, country_id, mountain_id, stars, latitude, longitude, picture, valid_from, valid_to
FROM accomodation
ORDER BY info_date_add DESC)
AS accomodation
LEFT JOIN db_cities
ON db_cities.id = accomodation.city_id
JOIN db_countries
ON db_countries.id = accomodation.country_id
JOIN skiresort_locations
ON
(((acos(sin((skiresort_locations.latitude*pi()/180)) *
sin((accomodation.latitude*pi()/180)) +
cos((skiresort_locations.latitude*pi()/180)) *
cos((accomodation.latitude*pi()/180)) *
cos(((skiresort_locations.longitude -
accomodation.longitude)*
pi()/180))))*180/pi())*60*1.1515*1.609344)
< '50'
INNER JOIN (SELECT accomodation_id, 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 >= 1
WHERE db_countries.title_url_en LIKE '%country_title%'
AND accomodation.region_id = '8'
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,
accomodation.title_en
LIMIT 10
OFFSET 0
作为一个小问题,不确定您是否需要原始的住宿选择作为子选择(或有一个 order by 子句,但您似乎没有限制,所以我认为它不会有任何效果):-
SELECT
accomodation.id,
accomodation.aid,
accomodation.title_en,
accomodation.title_url_en,
accomodation.address,
accomodation.city_id,
accomodation.zip,
accomodation.district_id,
accomodation.province_id,
accomodation.region_id,
accomodation.country_id,
accomodation.mountain_id,
accomodation.stars,
accomodation.latitude,
accomodation.longitude,
accomodation.picture,
accomodation.valid_from,
accomodation.valid_to,
db_cities.title_en AS city,
db_cities.title_url AS city_url,
db_countries.title_url_en AS country_url,
accomodation_rooms.total_persons
FROM accomodation
LEFT JOIN db_cities
ON db_cities.id = accomodation.city_id
JOIN db_countries
ON db_countries.id = accomodation.country_id
JOIN skiresort_locations
ON
(((acos(sin((skiresort_locations.latitude*pi()/180)) *
sin((accomodation.latitude*pi()/180)) +
cos((skiresort_locations.latitude*pi()/180)) *
cos((accomodation.latitude*pi()/180)) *
cos(((skiresort_locations.longitude -
accomodation.longitude)*
pi()/180))))*180/pi())*60*1.1515*1.609344)
< '50'
INNER JOIN (SELECT accomodation_id, 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 >= 1
WHERE db_countries.title_url_en LIKE '%country_title%'
AND accomodation.region_id = '8'
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,
accomodation.title_en
LIMIT 10 OFFSET 0
编辑 - 修改为获取每个援助的最新住宿记录并将其连接回来以获得最新住宿记录的其余部分。
SELECT
accomodation.*,
db_cities.title_en AS city,
db_cities.title_url AS city_url,
db_countries.title_url_en AS country_url,
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
JOIN db_countries ON db_countries.id = accomodation.country_id
JOIN skiresort_locations
ON
(((acos(sin((skiresort_locations.latitude*pi()/180)) *
sin((accomodation.latitude*pi()/180)) +
cos((skiresort_locations.latitude*pi()/180)) *
cos((accomodation.latitude*pi()/180)) *
cos(((skiresort_locations.longitude -
accomodation.longitude)*
pi()/180))))*180/pi())*60*1.1515*1.609344)
< '50'
INNER JOIN (SELECT accomodation_id, 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 >= 1
WHERE db_countries.title_url_en LIKE '%country_title%'
AND accomodation.region_id = '8'
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,
accomodation.title_en
LIMIT 10
OFFSET 0
编辑 - 使用 GROUP BY 子句添加 MIN 距离。但不确定这是否会比使用 DISTINCT 快得多。它强制对 JOIN 进行大量计算(即,如果您有 100 条住宿记录和 100 条 Skiresort_locations 记录,那么这将导致 10000 次合理的复杂计算来确定距离。如果您可以在那么这将节省相当多的时间(例如,稍微非规范化,但也许您有一个区域表连接到region_id上的住宿,并且它可能包含该区域的最小和最大纬度和经度,您可以使用它对于连接,然后将复杂的计算放入 WHERE 子句中)。此外,您还有一个用于 db_counties.title_url_en 的 LIKE 子句,该子句具有前导通配符,这会很慢,因为它不会使用索引(尽管它应该是在连接上使用country_id索引)。
SELECT
accomodation.*,
db_cities.title_en AS city,
db_cities.title_url AS city_url,
db_countries.title_url_en AS country_url,
accomodation_rooms.total_persons,
MIN(((acos(sin((skiresort_locations.latitude*pi()/180)) *
sin((accomodation.latitude*pi()/180)) +
cos((skiresort_locations.latitude*pi()/180)) *
cos((accomodation.latitude*pi()/180)) *
cos(((skiresort_locations.longitude -
accomodation.longitude)*
pi()/180))))*180/pi())*60*1.1515*1.609344)
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
JOIN db_countries ON db_countries.id = accomodation.country_id
JOIN skiresort_locations
ON
(((acos(sin((skiresort_locations.latitude*pi()/180)) *
sin((accomodation.latitude*pi()/180)) +
cos((skiresort_locations.latitude*pi()/180)) *
cos((accomodation.latitude*pi()/180)) *
cos(((skiresort_locations.longitude -
accomodation.longitude)*
pi()/180))))*180/pi())*60*1.1515*1.609344)
< '50'
INNER JOIN (SELECT accomodation_id, 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 >= 1
WHERE db_countries.title_url_en LIKE '%country_title%'
AND accomodation.region_id = '8'
GROUP BY accomodation.id,
db_cities.title_en,
db_cities.title_url,
db_countries.title_url,
accomodation_rooms.total_persons
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,
accomodation.title_en
LIMIT 10
OFFSET 0
关于MySQL 在行 SUM 之前选择连接和列乘法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17212551/
我正在创建一个 html 页面并想切换到页面的滚动和 float 。所以在正文或 div 中我想要一个元素列表。除非触摸到 div 的末尾,否则每个元素都应位于前一个元素的下方,然后它应该位于较高的部
我正在创建一个 html 页面并想切换到页面的滚动和 float 。所以在正文或 div 中我想要一个元素列表。除非触摸到 div 的末尾,否则每个元素都应位于前一个元素的下方,然后它应该位于较高的部
我有很多表,从我正在做选择的地方,但我只会写重要的部分。我有 2 张 table 住宿: id | title | desc | etc.. 住宿房间: id | accomodation_id |
我试图在数据框中找到相似的数字模式。我有一个包含 5 列的数据框,有些列的随机数介于 3 到 50 之间。但是,对于某些行,第 2 列或第 3 列没有数字。 A B C D E 5
我正在尝试使用 IntelliJ 在一个大型 java 文件中的第 65536 (2^16) 行之后安装断点,但事实证明这是不可能的。断点标有“X”,工具提示显示没有可执行代码。 是否有任何 Inte
我想在 bootstrap 表中并排显示两个图像,有什么想法吗? 这是代码, 7
我愿意: 从文件中读取行 查找包含指定文本的行(## Required reading) 如果行首包含星号 (*),则在带有特定文本的行之后打印下一行 如果下一行不再有带星号(*)的行(或不同的行),
我有以下 df Array = np.array([[87, 70, 95], [52, 47, 44], [44, 97, 94], [79, 36, 2]]) df_test
我有一个带有 onmouseover 功能的图像,它会在图像上显示一个带有一些选项的表格(图像变暗)。表格有一个 onmouseout 函数,它应该隐藏表格并再次显示图像。我遇到的问题是,每当鼠标在行
我有一个数组 A与形状 (N,)。我以 N=5 为例: A = np.array([0,1,1,0,1]) 我想将其转换为以下 NxN 矩阵 B . NumPy 和 Tensorflow 中的解决方案
预先感谢您的任何回复,这个论坛上的答案对我的研究非常宝贵。我是一名为了语言范式研究项目而学习 F# 的学生,我正在尝试利用 http://trelford.com/blog/post/specialk
这个问题在这里已经有了答案: Filter pandas DataFrame by substring criteria (17 个答案) 关闭 3 年前。 我有一个两列的数据框,一列是字符串,另一
我正在尝试学习 C 中的 malloc。我已经完成了一些 Java 编程,但想学习编码的具体细节。 让我解释一下我对此的了解,希望有人能填补空白。 行内: str = (char *) malloc(
我正在使用MVC3中的帮助程序Html.WebGrid,如何包括每个TR标签的数据? 我在列中有数据,我不想显示该列,并且我需要这些数据在表的TR上,然后使用JavaScript。 谢谢。 编辑 pu
我正在尝试将没有数据的数据库从 mysql 8 导出到 myqsl 5.7,但出现以下错误: Error 1726 (HY000) at line...: Storage engine 'InnoDB
我是一名优秀的程序员,十分优秀!