سؤال الاستعلام المتداخل في MySQL
-
19-09-2019 - |
سؤال
أحاول تعلم استفسارات متداخلة في MySQL وأنا عالق أثناء اختيار جميع الفنادق التي تقع على بعد 30 ميلا من المدينة وتحتوي على غرف تكلف 150 دولار
يمكنني اختيار الغرف التي تبلغ مساحتها 30 ميلا من المدينة وتكلفة 150 مع هذا الاستعلام، ولكن لا يمكن الوصول إلى الفنادق.
(select id from Rooms where cost = 150 and id in
(select r_id from has_rooms where name IN (select name from is_at where l_town in
(select town from Location where distance_from_city = 30))));
Rooms
+----+------+---------+
| id | cost | type |
+----+------+---------+
| 1 | 100 | kral |
| 2 | 0 | kralice |
| 3 | 150 | padisah |
| 4 | 150 | hop |
| 5 | 150 | boss |
+----+------+---------+
has_rooms
+------+------+
| r_id | name |
+------+------+
| 1 | A |
| 2 | B |
| 3 | C |
| 4 | A |
| 3 | A |
+------+------+
is_at
+------+----------+
| name | l_town |
+------+----------+
| A | istanbul |
| B | izmir |
| C | kars |
| D | adana |
+------+----------+
select * from Location;
+--------------------+----------+----------------+----------+
| distance_from_city | postcode | street | town |
+--------------------+----------+----------------+----------+
| 30 | NULL | KENNEDY Street | istanbul |
| 35 | NULL | NULL | kars |
| 40 | NULL | Tenesse | izmir |
| 50 | NULL | NULL | adana |
+--------------------+----------+----------------+----------+
Hotel
+------+--------+
| name | rating |
+------+--------+
| A | 5 |
| B | 5 |
| C | 4 |
| D | 1 |
+------+--------+
المحلول
SELECT h.*
FROM hotel h
JOIN is_at ia
ON ia.name = h.name
JOIN location l
ON l.town = ia.town
WHERE EXISTS
(
SELECT NULL
FROM rooms r
JOIN has_rooms hr
ON hr.r_id = r.id
WHERE hr.name = h.name
AND r.cost = 150
)
AND distance_from_city <= 30
نصائح أخرى
لست متأكدا من السبب في أنك تريد استخدام استفسارات متداخلة هنا. لماذا لا تفعل شيئا مثل هذا؟
SELECT h.name
FROM rooms r
, has_rooms h
, is_at i
, location l
, hotel o
WHERE r.cost = 150
AND h.r_id = r.id
AND i.name = h.name
AND i.l_town = l.town
AND l.distance_from_city = 30
AND i.name = o.name
لا تنتمي إلى StackOverflow