我需要一个没有重复的唯一行,我想找到相互出现次数最多的情侣(一对 Actor )。 例如:
我的输出:
+----------+-----------+
|actor1_id | actor2_id |
+----------+-----------+
| 27 | 60 |
| 60 | 27 |
+----------+-----------+
我需要:
+----------+-----------+
|actor1_id | actor2_id |
+----------+-----------+
| 27 | 60 |
+----------+-----------+
这是代码:
SELECT T3.actor1_id ,T3.actor2_id
FROM actor,
(SELECT T1.actor_id AS actor1_id , T2.actor_id AS actor2_id, COUNT(T1.film_id) AS mutual_films
FROM(
SELECT film_actor.film_id AS film_id , film_actor.actor_id AS actor_id
FROM film_actor) AS T1 ,
(
SELECT film_actor.film_id AS film_id , film_actor.actor_id AS actor_id
FROM film_actor) AS T2
WHERE T1.film_id = T2.film_id AND T1.actor_id != T2.actor_id
GROUP BY T1.actor_id , T2.actor_id) AS T3
WHERE T3.mutual_films =
(SELECT MAX(T3.mutual_films) AS max_mutual
FROM
(SELECT T1.actor_id AS actor1_id , T2.actor_id AS actor2_id, COUNT(T1.film_id) AS mutual_films
FROM(
SELECT film_actor.film_id AS film_id , film_actor.actor_id AS actor_id
FROM film_actor) AS T1 ,
(
SELECT film_actor.film_id AS film_id , film_actor.actor_id AS actor_id
FROM film_actor) AS T2
WHERE T1.film_id = T2.film_id AND T1.actor_id != T2.actor_id
GROUP BY T1.actor_id , T2.actor_id) AS T3)
AND T3.actor1_id != T3.actor2_id
GROUP BY T3.actor1_id , T3.actor2_id
最佳答案
您可以使用 UNION 语句将 2 列合并为一列,然后对它们进行 DISTINCT SELECT。像这样的东西:
SELECT DISTINCT comb.actor_id FROM (
SELECT s1.actor1_id AS actor_id FROM source_table AS s1
UNION
SELECT s2.actor2_id AS actor_id FROM source_table AS s2
) AS comb
会导致
+---------+
|actor_id |
+---------+
| 27 |
| 60 |
+---------+
现在您可以在派生表上使用 JOIN。
关于MySQL 唯一行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40972315/