代码之家  ›  专栏  ›  技术社区  ›  Thuan Nguyen

SQL:如何获取表的列表对

  •  1
  • Thuan Nguyen  · 技术社区  · 6 年前

    要求:列出经常光顾同一酒吧的顾客对(即,列出可能在咖啡馆遇到的所有顾客对)

    吧台:

    -------------------------
    id| name                 
    -------------------------
    1 | Vivamus nibh         
    2 | odio tristique       
    3 | vulputate ullamcorper
    4 | Cras lorem           
    5 | libero est,          
    

    -----------------------
    id| name              
    -----------------------
    1 | Warren    
    2 | Olympia            
    3 | Logan
    4 | Summer
    5 | Kamal
    6 | Fernandez
    

    常客表:

    -----------------
    cust_id | bar_id
    -----------------
    1       | 1
    2       | 1
    3       | 2
    4       | 2
    5       | 3
    6       | 4
    

    预期产出:

    ---------------------------------------
    customer1 | customer2 | barname
    ---------------------------------------
    Warren    |  Olympia  | Vivamus nibh
    Logan     |  Summer   | odio tristique
    

    这是我的尝试,但没有成功:

    select c1.name, c2.name, b1.name, b2.name
    from frequents f1, frequents f2
    join bar b1 on f1.bar_id = b1.id
    join bar b2 on f2.bar_id = b2.id
    join customer c1 on f1.cust_id = c1.id
    join customer c2 on f2.cust_id = c2.id
    where f1.bar_id = f2.bar_id;
    
    3 回复  |  直到 6 年前
        1
  •  4
  •   Mureinik    6 年前

    您可以将bar表与frequency表联接两次,然后继续联接以获取客户名称。为了防止重复,您可以任意决定 cust_id 应小于另一个:

    SELECT b.name, c1.name, c2.name
    FROM   bar b
    JOIN   frequents f1 ON f1.bar_id = b.id
    JOIN   frequents f2 ON f2.bar_id = b.id AND f1.cust_id < f2.cust_id
    JOIN   customer  c1 ON c1.id = f1.cust_id
    JOIN   customer  c2 ON c2.id = f2.cust_id
    

    DBFiddle

        2
  •  1
  •   Madhur Bhaiya    6 年前

    我正在使用子查询加入具有相同酒吧但不同客户的常客,并使用>避免重复

    SELECT c1.name customer1, f2.name customer2, b.name barname
    FROM frequents f
    JOIN customer c1 ON c1.id = f.cust_id
    JOIN bar b ON f.bar_id = b.id
    JOIN (SELECT cust_id, bar_id, name
          FROM frequents 
          JOIN customer ON id = cust_id) AS f2 ON f2.bar_id = f.bar_id AND f2.cust_id > f.cust_id 
    

    https://www.db-fiddle.com/f/npYnEgJAdH4yPa6NqBiqoT/1

        3
  •  0
  •   LukStorms    6 年前

    要获得每个条的所有对,自加入Frequents表可以得到。

    SELECT 
    cust1.name AS customer1, 
    cust2.name AS customer2, 
    bar.name AS barname
    FROM frequents freq1
    JOIN frequents freq2 ON (freq2.bar_id = freq1.bar_id AND freq2.cust_id > freq1.cust_id)
    JOIN bar ON bar.id = freq1.bar_id
    LEFT JOIN customer cust1 ON cust1.id = freq1.cust_id
    LEFT JOIN customer cust2 ON cust2.id = freq2.cust_id
    ORDER BY freq1.cust_id, freq2.cust_id, freq1.bar_id;
    

    SqlFiddle测试 here