Как ВЫБРАТЬ данные, которые имеют отношение к 2 или более данных в МНОГИХ МНОГИЕХ таблицах - PullRequest
0 голосов
/ 15 января 2019

У меня есть 3 таблицы в MySQL, которые называются tb_tour_trip, tb_facilities и tb_master_facilities, которые имеют отношение ко многим. Я хочу выбрать 1 данные в tb_tour_trip, которые имеют 2 или более master_facilities. Например: я хочу выбрать поездку с удобствами: AC и WiFi

Это таблица tb_tour_trip:

tb_tour_trip
============
id || name  || description  || price
===================================
1  || trip1 || example trip || $200
2  || trip2 || example trip || $300

Это таблица tb_facilities (для отношений MANY - MANY):

tb_facilities
============
id || id_master_facilities_ref || id_tour_trip_ref
===================================
1  || 1                        || 1 
2  || 2                        || 1 
3  || 1                        || 2
3  || 3                        || 2

А это моя таблица tb_master_facilities:

tb_master_facilities
============
id || name  || status
====================
1  || WiFi  || 1
2  || AC    || 1
3  || TV    || 1

если пробовал этот запрос:

SELECT id_tour_trip_ref FROM tb_facilities WHERE id_master_facilities_ref IN(1,2);

это показывает мне id_tour_trip, у которого есть удобства: AC или Wifi, но это не то, что я хочу.

Я хочу, чтобы id_tour_trip имел только AC и Wifi.

Точно вывод просто:

id_tour_trip_ref
================
1

Как я могу это сделать? спасибо раньше.

Ответы [ 5 ]

0 голосов
/ 16 января 2019

Я нашел ответ на форуме в Facebook. спасибо за все ваши советы:)

Это именно то, что мне нужно.

SELECT id_tour_trip_ref, GROUP_CONCAT(id_master_facilities_ref) AS facilities FROM tb_facilities GROUP BY id_tour_trip_ref HAVING FIND_IN_SET('1', facilities) > 0 AND FIND_IN_SET('2', facilities) > 0
0 голосов
/ 15 января 2019

Я бы соединил все таблицы вместе и просто делал 'где условие1 и условие2. Это, вероятно, менее эффективно, но имхо более всеобъемлющее.

select distinct tb_tour_trip.id from tb_tour_trip 

inner join tb_facilities on tb_facilities.id_tour_trip_ref = tb_tour_trip.id
inner join tb_master_facilities on tb_master_facilities.id = tb_facilities.id_master_facilities_ref 

where tb_master_facilities.name = 'WiFi'
and tb_master_facilities.name = 'AC'
0 голосов
/ 15 января 2019

Если вы хотите получить точный вывод, это также может сработать:

SELECT id_tour_trip_ref FROM tb_facilities INNER JOIN tb_master_facilities ON tb_facilities.id=tb_master_facilities.id WHERE name IN ("WiFi","AC") AND id_master_facilities_ref IN (1,2) GROUP BY id_tour_trip_ref;

0 голосов
/ 15 января 2019

Один метод - агрегация с предложением HAVING:

SELECT f.id_tour_trip_ref 
FROM tb_facilities f INNER JOIN
     tb_master_facilities
     ON f.id = mf.id 
WHERE f.name IN ('WiFi', 'AC') 
GROUP BY f.id_tour_trip_ref
HAVING COUNT(*) = 2;
0 голосов
/ 15 января 2019

Есть несколько способов сделать это, но достаточно простой для чтения / поддержки метод:

SELECT id
FROM tb_tour_trip AS ttt
WHERE (
    SELECT COUNT(DISTINCT id_master_facilities_ref)
    FROM tb_facilities AS tbf
    WHERE tbf.id_tour_trip_ref = ttt.id
    AND tbf.id_master_facilities_ref IN (1, 2)
) = 2;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...