2017-01-17 2 views
1

Ich habe die folgenden Tabellen:MySql: Fetch Datensätze aus mehreren Tabellen durch arithmetische Operationen

table_1 
------------------ 
id  uid  category balance 
1  1  A   100 
2  2  B   80 

table_2 
------------------ 
id  uid  name 
1  1  ABC 
2  2  XYZ 

table_2 
------------------ 
id  uid  last_pay 
1  1  10 
2  1  10 
3  1  10 
4  2  80 

ich Datensätze aus den drei Tabellen und die Bedingungen greifen wollen, sind wie folgt:

a) table_1.category = something 
b) (table_1.balance - table_3.SUM(`last_pay`)) > 0 

ich mag den table_1.category = 'A', weil (100 - (10 + 10 + 10))> 0

den Versuch, diese Abfrage aber seine nicht funktioniert:

SELECT t1.uid,t1.category,t1.balance,t2.uid,t2.name FROM table_1 as t1 
LEFT JOIN table_2 as t2 ON t1.uid = t2.uid 
WHERE t1.category = 2 
AND t1.balance - (SELECT SUM(`last_pay`) FROM table_3 WHERE uid = ?) 
+1

Ihre Frage ist unklar. Balance scheint in der ersten Tabelle zu sein, nicht in der zweiten.Wenn Sie eine Summe berechnen möchten, müssen Sie höchstwahrscheinlich mit 'GROUP BY' aggregieren. Können Sie Ihre Frage aufräumen und Ihre erwartete Ausgabe zeigen? –

+0

@TimBiegeleisen Ich habe die Konditionen aktualisiert. Bitte schauen Sie jetzt – pkdq

+1

Sie haben noch 2 'table_2' Auch Ihre Daten scheinen nicht normalisiert zu sein. –

Antwort

1

OK, ich gebe Ihnen eine vollständige Antwort mit normalisierten Tabellen:

Sie können die table_2 normalisieren und die Spalte name Tabelle table_1 einzufügen. Sehen Sie im folgenden und neuen Tabellenstruktur (mit table_1 und table_2):

table_1 
-------------------------------------------- 
id  uid  category balance  name 
1  1  A   100   ABC 
2  2  B   80   XYZ 

table_2 
------------------------ 
id  uid  last_pay 
1  1  10 
2  1  10 
3  1  10 
4  2  80 

diese Tabellen zu erstellen, können Sie das folgende Skript verwenden:

CREATE TABLE table_1 (
    `id` INT, 
    `uid` INT, 
    `category` VARCHAR(1), 
    `balance` INT, 
    `name` VARCHAR(3) 
); 

INSERT INTO table_1 VALUES 
    (1, 1, 'A', 100, 'ABC'), 
    (2, 2, 'B', 80, 'XYZ'); 

CREATE TABLE table_2 (
    `id` INT, 
    `uid` INT, 
    `last_pay` INT 
); 

INSERT INTO table_2 VALUES 
    (1, 1, 10), 
    (2, 1, 10), 
    (3, 1, 10), 
    (4, 2, 80); 

Eine Abfrage Ihr erwartetes Ergebnis zu erhalten:

SELECT t1.uid, t1.category, t1.balance, t2.uid, t1.name 
FROM table_1 t1 
    LEFT JOIN (
     SELECT uid, SUM(last_pay) AS last_pay 
     FROM table_2 
     GROUP BY uid 
    ) t2 ON t1.uid = t2.uid 
WHERE (t1.balance - t2.last_pay) > 0 

Sie können ein funktionierendes Beispiel finden Sie hier:http://sqlfiddle.com/#!9/a2e27/3/0

Sie möchten Ihre ursprünglichen Tabellen verwenden? [Antwort für die ursprüngliche Frage]

Wenn es möglich ist, empfehle ich, die Tabellen zu normalisieren! Wenn es nicht möglich ist, die Tabellenstruktur zu ändern, können Sie die folgende Abfrage verwenden, um Ihr erwartetes Ergebnis:

SELECT t1.uid, t1.category, t1.balance, t2.uid, t2.name 
FROM table_1 AS t1 LEFT JOIN table_2 AS t2 ON t1.uid = t2.uid 
    LEFT JOIN (
     SELECT uid, SUM(last_pay) AS last_pay 
     FROM table_3 
     GROUP BY uid 
    ) t3 ON t1.uid = t3.uid 
WHERE (t1.balance - t3.last_pay) > 0 

Sie ein funktionierendes Beispiel finden Sie hier:http://sqlfiddle.com/#!9/f22024/7/0

+0

Vielen Dank Sebastian. Wirklich sehr geholfen, weil Sie nicht nur die Lösung zur Verfügung gestellt haben, sondern auch darauf hinweisen, den Tisch zu normalisieren. Wirklich sehr glücklich. Vielen Dank. – pkdq

1

Tabelle erstellen/Daten einfügen

CREATE TABLE table_1 
    (`id` int, `uid` int, `category` varchar(1), `balance` int) 
; 

INSERT INTO table_1 
    (`id`, `uid`, `category`, `balance`) 
VALUES 
    (1, 1, 'A', 100), 
    (2, 2, 'B', 80) 
; 


CREATE TABLE table_2 
    (`id` int, `uid` int, `name` varchar(3)) 
; 

INSERT INTO table_2 
    (`id`, `uid`, `name`) 
VALUES 
    (1, 1, 'ABC'), 
    (2, 2, 'XYZ') 
; 



CREATE TABLE table_3 
    (`id` int, `uid` int, `last_pay` int) 
; 

INSERT INTO table_3 
    (`id`, `uid`, `last_pay`) 
VALUES 
    (1, 1, 10), 
    (2, 1, 10), 
    (3, 1, 10), 
    (4, 2, 80) 
; 

Diese Abfrage prüft, ob beide table_1 Kategorien A und B Und wenn die table_1.balans höher ist dann 0, wenn table_3.last_pay zusammen pro Kategorie summiert

Abfrage

SELECT 
    table_1.uid 
, table_1.category 
, table_1.balance 
, table_2.uid 
, table_2.name 
FROM (
SELECT 
    uid 
    , SUM(table_3.last_pay) sum_last_pay 
FROM 
    table_3 
GROUP BY 
    table_3.uid 
) AS 
table_3_summed 

INNER JOIN 
table_1 
ON 
    table_1.uid = table_3_summed.uid 

INNER JOIN 
table_2 
ON 
table_1.uid = table_2.uid 

WHERE 
(table_1.balance - table_3_summed.sum_last_pay) > 0 

Ergebnis

uid category balance  uid name  
------ -------- ------- ------ -------- 
    1 A    100  1 ABC  
Verwandte Themen