2016-11-25 4 views
-2

Ich habe zwei Tabellen tbl_money und tbl_cat.Wählen Sie Daten aus einer Tabelle mit den Bedingungen aus einem anderen

tbl_money enthält name, cat_id, price.

tbl_cat enthält cat_id, content, date, customer_id.

Hinweis: Jeder Datensatz von tbl_cat aus tbl_money durch Spalte viele Datensätze beitreten cat_id

ich die Datensätze aus tbl_money auswählen möchten, die haben die gleiche price, gleiche date und gleiche customer_id.

Ich habe das Bild der wahren Daten angehängt. Click here to view

Was ist die richtige Syntax, die mir dabei helfen.

Vielen Dank!

+1

Können Sie bitte zeigen, was Sie bis jetzt versucht haben und finden Sie den Link hilfreich http://www.w3schools.com/sql/sql_join_left.asp – Veerendra

+1

Geben Sie Ihre Beispieldaten und Beispiel erwartetes Ergebnis. – Viki888

+1

teilen Sie Ihre Abfrage und Beispieltabellendaten – AftabHafeez

Antwort

1
drop table if exists tablea; 
create table tablea(id int,catid varchar(6),acca int,accb int,price int); 

drop table if exists tableb; 
create table tableb(catid varchar(6),name varchar(7),customer varchar(6), dt date); 

truncate tablea; truncate tableb; 

insert into tablea values 
(2,'Order5',111,131,40),(3,'Order1',131,511,40),(4,'Order2',131,511,40),(5,'Order3',111,131,30),(6,'Order3',133,131,10); 

insert into tableb values 
(1,'Order1','Apple','2016-11-02'),(2,'Order2','Apple','2016-11-11'),(3,'Order3','Apple','2016-11-11'),(4,'Order4','Google','2016-11-11'); 

Der erste Schritt in dieser Lösung ist, einen Dummy-Schlüssel (k) und entscheidet, zu erstellen, wenn die Zeile ein Elternteil oder ein Kind ist

MariaDB [sandbox]> select a.*, 
    -> case when a.acca = 131 then 1 
    -> else 2 
    -> end as ParentOrChild, 
    -> case when a.acca = 131 then concat(131 , year(b.dt), month(b.dt),day(b.dt),b.customer) 
    -> else concat(a.accb, year(b.dt), month(b.dt),day(b.dt),b.customer) 
    -> end as k 
    -> from tablea a 
    -> join tableb b on b.name = a.catid; 
+------+--------+------+------+-------+---------------+------------------+ 
| id | catid | acca | accb | price | ParentOrChild | k    | 
+------+--------+------+------+-------+---------------+------------------+ 
| 3 | Order1 | 131 | 511 | 40 |    1 | 1312016112Apple | 
| 4 | Order2 | 131 | 511 | 40 |    1 | 13120161111Apple | 
| 5 | Order3 | 111 | 131 | 30 |    2 | 13120161111Apple | 
| 6 | Order3 | 133 | 131 | 10 |    2 | 13120161111Apple | 
+------+--------+------+------+-------+---------------+------------------+ 
4 rows in set (0.00 sec) 

Die nächste Stufe funktioniert, wenn die gesamten Kinderpreise Streichhölzer aus die Mutter Preis

MariaDB [sandbox]> select s.parentorchild, s.k, 
    -> sum(case when s.parentorchild = 1 then s.price else 0 end) - 
    -> sum(case when s.parentorchild = 2 then s.price else 0 end) MatchedPrice 
    -> from 
    -> (
    -> select a.*, 
    -> case when a.acca = 131 then 1 
    -> else 2 
    -> end as ParentOrChild, 
    -> case when a.acca = 131 then concat(131 , year(b.dt), month(b.dt),day(b.dt),b.customer) 
    -> else concat(a.accb, year(b.dt), month(b.dt),day(b.dt),b.customer) 
    -> end as k 
    -> from tablea a 
    -> join tableb b on b.name = a.catid 
    ->) s 
    -> group by s.k 
    -> order by s.k,s.parentorchild; 
+---------------+------------------+--------------+ 
| ParentOrChild | k    | MatchedPrice | 
+---------------+------------------+--------------+ 
|    1 | 13120161111Apple |   0 | 
|    1 | 1312016112Apple |   40 | 
+---------------+------------------+--------------+ 
2 rows in set (0.00 sec) 

wir wissen nun, die der Dummy-Schlüssel (k), dass wir interessiert sind (MatchedPrice = 0) so, wenn wir wieder auf Dummy-Verbindungsschlüssel bekommen wir die Reihen wir in

012.351 interessiert sind

Beachten Sie, dass es für Leistungszwecke möglicherweise besser ist, wenn Sie Arbeitstabellen verwenden, anstatt zu versuchen, dies in einer einzelnen Abfrage zu tun.

Verwandte Themen