Sync
Новичок
Застрял с выборкой: 3 таблицы + many-to-many
Суть вроде проста. Есть 3 таблицы: таблица номеров (rooms), таблица возрастных категорий (ages) и таблица связки номеров и возр. категорий (rooms_ages) - то есть, какие возрастные категории могут размещаться в номерах.
Таблица rooms:
Таблица ages (здесь age_start, age_end - возраст от и до):
И таблица связки rooms_ages:
На входе имеем массив возрастов (количество неизвестно), на пальцах пусть 16 и 25 лет.
Нужно отобрать все комнаты, которые могут принять этих двух поселенцев.
Полдня попыток приводили к каким-то запросам, но не совсем верным. На чем остановился:
То есть кол-во таблиц (aN, raN) == количеству поселенцев.
Среди результатов запроса есть правильные данные, но есть и левые, причем total по логике не совсем верный выходит.
Вобщем что-то не так, а что - не пойму.
Буду ОЧЕНЬ благодарен за помощь. Если нужны дампы - выложу.
Суть вроде проста. Есть 3 таблицы: таблица номеров (rooms), таблица возрастных категорий (ages) и таблица связки номеров и возр. категорий (rooms_ages) - то есть, какие возрастные категории могут размещаться в номерах.
Таблица rooms:
PHP:
+--------------+-----------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+--------------+-----------------------+------+-----+---------+----------------+
| room_id | int(11) | | PRI | NULL | auto_increment |
| name | varchar(255) | | | | |
+--------------+-----------------------+------+-----+---------+----------------+
PHP:
+-----------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-----------+-------------+------+-----+---------+----------------+
| age_id | int(11) | | PRI | NULL | auto_increment |
| age_start | tinyint(4) | | | 0 | |
| age_end | tinyint(4) | | | 0 | |
+-----------+-------------+------+-----+---------+----------------+
PHP:
+----------+---------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+---------+------+-----+---------+-------+
| room_id | int(11) | | MUL | 0 | |
| age_id | int(11) | | MUL | 0 | |
+----------+---------+------+-----+---------+-------+
Нужно отобрать все комнаты, которые могут принять этих двух поселенцев.
Полдня попыток приводили к каким-то запросам, но не совсем верным. На чем остановился:
PHP:
SELECT r.* , COUNT(*) AS total
FROM rooms r, ages a1, ages a2, rooms_ages ra1, rooms_ages ra2
WHERE
(
r.room_id = ra1.room_id
AND ra1.age_id = a1.age_id
AND (
a1.age_start <=16
AND a1.age_end >=16
)
)
AND
(
r.room_id = ra2.room_id
AND ra2.age_id = a2.age_id
AND (
a2.age_start <=25
AND a2.age_end >=25
)
)
GROUP BY room_id
Среди результатов запроса есть правильные данные, но есть и левые, причем total по логике не совсем верный выходит.
Вобщем что-то не так, а что - не пойму.
Буду ОЧЕНЬ благодарен за помощь. Если нужны дампы - выложу.