2016-12-05 60 views
2

我需要一個沒有重複的獨特行,我想找到具有最大相互出現的夫婦(配對演員)。 例如:MySQL獨特行

我的輸出:

  +----------+-----------+ 
      |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 

回答

2

只需使用<,而不是在!= WHERE子句:

T3.actor1_id < T3.actor2_id 
2

你可以使用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上派生表。

+0

沒有,也許我會比情侶更多,所以我得 – Audais

+1

你的意思是演員的2列你可以有像actor1_id,actor2_id,actor3_id等東西?未定義的與actor_ids的列數量?或未定義數量的行?在這次嘗試中,行並不重要。你可以有數百個。 – antesoles

1

只需使用CASE表達式交換2列之間的值。然後找到不同的行。

查詢

select t.`actor1_id_sub` as `actor1_id`, 
t.`actor2_id_sub` as `actor2_id` from(
    select `actor1_id`, `actor2_id`, 
    case when `actor1_id` < `actor2_id` then `actor1_id` 
    else `actor2_id` end as `actor1_id_sub`, 
    case when `actor1_id` < `actor2_id` then `actor2_id` 
    else `actor1_id` end as `actor2_id_sub` 
    from `actors` 
)t 
group by t.`actor1_id_sub`, t.`actor2_id_sub`; 

SQL Fiddle Demo

0

這可以使用not exists來實現的,如下面 -

SELECT * 
    FROM film_actor t1 
WHERE NOT EXISTS (SELECT 1 
      FROM film_actor t2 
     WHERE t1.actor2_id = t2.actor1_id 
      AND t1.actor1_id = t2.actor2_id 
      AND t1.actor1_id > t1.actor2_id) 
0

只有我能想到的一種方式: 在表格中創建另一個字段,並在該字段中以相同的順序(較小的第一個或較大的第一個)存儲這兩個ID。所以你的桌子看起來就像這樣

+----------+-----------+-----------+ 
|actor1_id | actor2_id | actor_ids | 
+----------+-----------+-----------+ 
| 27  | 60  | 27-60 | 
| 60  | 27  | 27-60 | 
+----------+-----------+-----------+ 

然後通過使用actor_ids行創建你的SELECT DISTINCT語句。

2

請檢查此問題,可能您的問題通過此查詢解決。

SELECT test_status, system_generated FROM test_details WHERE test_status <= system_generated 
UNION 
SELECT system_generated, test_status FROM test_details WHERE system_generated < test_status