MySQL ВЫБРАТЬ ИЗ таблицы отношений ГДЕ они имеют одинаковых родственников - PullRequest
0 голосов
/ 12 декабря 2018

У меня возникла ситуация, когда есть таблица отношений, подобная этой:

eaters:

id   name     fruit
1    jack     banana
2    jack     apple
3    jane     banana
4    jane     apple
5    jane     orange
6    richard  banana
7    richard  apple

Теперь, кто ел те же фрукты, что и «Джек»?

Например,в приведенной выше таблице ответом «Ричард» является

Псевдопросмотр, который я имею в виду:

SELECT name AS the_guy 
FROM eaters 
WHERE 
  (SELECT fruit FROM eaters WHERE name=the_guy) = 
  (SELECT fruit FROM eaters WHERE name='jack')

И я не знаю, возможно ли это даже в MySQL.На данный момент я извлек всю таблицу и извлеку ответ из результата с помощью PHP, что не является хорошим подходом.Есть предложения?

Ответы [ 4 ]

0 голосов
/ 12 декабря 2018

лучше используйте это:

SELECT DISTINCT
       e.name
FROM eaters e
WHERE name <> 'jack'
      AND NOT EXISTS
(
    SELECT DISTINCT
           name
    FROM eaters e1
    WHERE NOT EXISTS
    (
        SELECT * FROM eaters e2 WHERE e2.name = 'jack' AND e1.fruit = e2.fruit
    )
          AND e1.name = e.name
);
0 голосов
/ 12 декабря 2018

Одним из способов может быть использование условного Group_Concat() с предложением Having.Мы можем получить все плоды jack в упорядоченной строке, разделенной запятыми, в подзапросе (производная таблица).

Теперь мы можем получить такой же упорядоченный список фруктов для других парней и использовать условие HAVING, чтобы рассмотреть те значения name, которые соответствуют "jack_fruits".

Запрос

SELECT t1.name AS the_guy 
FROM eaters AS t1 
JOIN (SELECT GROUP_CONCAT(fruit ORDER BY fruit) AS jack_fruits
      FROM eaters 
      WHERE name = 'jack') AS t2 
WHERE t1.name <> 'jack' 
GROUP BY t1.name 
HAVING GROUP_CONCAT(t1.fruit ORDER BY fruit) = MAX(t2.jack_fruits );

Результат

| the_guy |
| ------- |
| richard |

Просмотр на БД Fiddle

0 голосов
/ 12 декабря 2018

Это легко понять:

SELECT DISTINCT name FROM eaters 
WHERE
    name <> 'Jack' 
    AND 
    fruit IN (SELECT fruit FROM eaters WHERE name = 'Jack')
0 голосов
/ 12 декабря 2018

Вы можете написать:

SELECT e2.name
FROM   eaters e1
      INNER JOIN eaters e2
              ON e1.fruit = e2.fruit
WHERE  e1.name = 'Jack'
      AND e2.name != 'Jack'
GROUP  BY e2.name 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...