首先,在此先感謝。具有特定基數的SQL查詢(多對多):解決方案
我有三個表中MariaDB的
sensor
+---------------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+---------------+-------------+------+-----+---------+-------+
| name | varchar(64) | NO | PRI | NULL | |
| reload_time | int(11) | NO | | NULL | |
| discriminator | varchar(20) | NO | | NULL | |
+---------------+-------------+------+-----+---------+-------+
sensor_common_service
+---------------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+---------------+-------------+------+-----+---------+-------+
| service_name | varchar(64) | NO | PRI | NULL | |
| sensor_name | varchar(64) | NO | PRI | NULL | |
+---------------+-------------+------+-----+---------+-------+
common_service
+---------------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+---------------+-------------+------+-----+---------+-------+
| service_name | varchar(64) | NO | PRI | NULL | |
| version | int(11) | NO | | NULL | |
| reload_time | int(11) | NO | | NULL | |
+---------------+-------------+------+-----+---------+-------+
而且我想,它們擁有完全一組傳感器,例如,所有common_services,已作爲傳感器的溫度和溼度都common_services。
所以,如果我有
common_service1 : sensors [temperature]
common_service2 : sensors [temperature,humidity]
common_service3 : sensors [temperature,humidity, luminosity]
查詢應只返回common_service2。
我的第一個學嘗試是試圖在Join between mapping (junction) table with specific cardinality
適應查詢,這是結果
SELECT * FROM custom_service
JOIN (
SELECT scm.service_name FROM sensor_custom_service scm
WHERE scm.sensor_name IN (
SELECT s.name FROM sensor s
WHERE s.name='luminosity' OR s.name='temperature'
)
GROUP BY scm.service_name HAVING COUNT(DISTINCT scm.sensor_name)=2
) AS jt
ON custom_service.service_name=jt.service_name;
一個又一個,
SELECT scs.* FROM sensor_custom_service scs
where scs.sensor_name IN ('luminosity', 'temperature')
GROUP BY scs.service_name;
HAVING COUNT(scs.sensor_name) = 2
但有了這個疑問我也得到了common_services有其他傳感器 ,因爲有計數只計算符合where子句的sensor_custom_service。
使用上面的例子這個查詢都返回
common_service2 : sensors [temperature,humidity]
common_service3 : sensors [temperature,humidity]
我認爲這個查詢將使用INTERSECT運算符某事像這樣
SELECT scs.* FROM sensor_custom_service scs
where scs.sensor_name IN ('luminosity', 'temperature')
INTERSECT
SELECT scs.* FROM sensor_custom_service scs
HAVING COUNT(scs.sensor_name) = 2
容易,但Mariabb返回
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'INTERSECT
,因爲它不被支持(我認爲,因爲這兩個查詢單獨工作)
在此先感謝!
使用9000的查詢的解決方案。
select *
from custom_service cs
where
exists (select 1 from sensor_custom_service scs where
scs.service_name = cs.service_name and
scs.sensor_name = 'luminosity')
AND
exists (select 1 from sensor_custom_service scs where
scs.service_name = cs.service_name and
scs.sensor_name = 'temperature')
AND
NOT exists (select 1 from sensor_custom_service scs where
scs.service_name = cs.service_name and
scs.sensor_name NOT IN ('temperature', 'luminosity'));
謝謝!您的查詢也可以正常工作,而且更簡單! –