2017-03-14 2 views
-2

Tabelle OrdersWas kann ich in Mysql auswählen?

enter image description here

eine Auftragstabelle Es gibt, wo user_id der Benutzer-ID ist, ist item_id die ID des bestellten Produktes. Es ist notwendig, eine Probe von Paaren von Waren von verschiedenen Benutzern, nämlich das folgende Ergebnis bestellt zu erhalten:

Ergebnis Tabelle

enter image description here

Ich kann nicht verstehen, wie dies zu tun? Danke Jungs

+2

Was ist die Logik dahinter? – Jens

+2

Was genau möchten Sie tun? – Soheyl

+0

Sie müssen viel besser erklären, was Sie tun möchten, wenn Sie möchten, dass jemand Ihren Code für Sie schreibt – RiggsFolly

Antwort

0

Wenn Sie eine Liste der Produktpaare zu erhalten (2 Produkte), die von mehreren Kunden bestellt wurden, dann

  1. Erstellen Sie eine Liste von Produktpaaren durch den Kunden durch Selbst Verbinden Sie Ihren Tisch auf sich selbst (innere Subqueries)

  2. diese Liste auf sich selbst wieder Mitglied werden, aber für verschiedene Kunden (äußere Abfrage)

würde ich die followi erstellen ng Abfrage:

select distinct 
    (select t1.user_id, t1.item_id as item_id1, t2.item_id as item_id2 
    from table t1 
    inner join table t2 on t1.user_id=t2.userid and t1.item_id<t2.item_id) l1 
inner join 
    (select t1.user_id, t1.item_id as item_id1, t2.item_id as item_id2 
    from table t1 
    inner join table t2 on t1.user_id=t2.userid and t1.item_id<t2.item_id) l2 
    on l1.user_id<>l2.user_id and l1.item_id1=l2.item_id1 and l1.item_id2=l2.item_id2 

Die t1.item_id<t2.item_id Join-Bedingung wird sichergestellt, dass ein bestimmtes Produkt Paar nur einmal abgerufen werden, so dass Sie 3, 4 haben, aber nicht 4, 3, auch schließt es Paarung Produkte mit sich selbst, so dass Sie nicht 3, 3 haben .

+0

Oh danke. Ich habe es irgendwie verstanden. Aber immer noch schwierig für mich. Danke nochmal, du hast mir geholfen. Du bist toll!!! – Yurii

0

Sie können dies tun, ohne Unterabfragen (gut, vorausgesetzt, Sie sind eine items Tabelle haben):

select i1.item_id, i2.item_id, count(*) 
from items i1 join 
    items i2 
    on i1.item_id < i2.item_id join 
    orders o1 
    on o1.item_id = i1.item_id join 
    orders o2 
    on o2.item_id = i2.item_id and 
     o2.order_id = o1.order_id 
group by i1.item_id, i2.item_id 
having count(*) > 1; 

Die Verbindung zwischen i1 und i2 erzeugt eine Liste aller Paare von Elementen, mit dem ersten Element kleiner als die Sekunde (verhindert Duplikate).

Die Verknüpfung zu o1 bringt die Auftrags-ID für den ersten Artikel.

Die Verbindung zu o2 bringt die Auftrags-ID für den zweiten Artikel - und stellt sicher, dass die Auftrags-ID die gleiche wie für den ersten Artikel ist.

Die group by zählt die Anzahl der Bestellungen, die beide Artikel haben.

Und die having Klausel stellt sicher, dass es mindestens zwei gibt.

Verwandte Themen