Mysql Abrafge in 2 richtungen mit Join

ArtusPendragon

Grünschnabel
Servus

ich hab da ein kleines Problem.

ich möchte ein mysql querry bauen der über 4 Tabellen geht in 2 richtungen.

PHP:
SELECT dkp_chars.char_id, 

(CASE WHEN `raid_date` IS NOT NULL THEN `raid_date` ELSE 0 END) AS `last_raid`,
(CASE WHEN SUM(`raid_value`) IS NOT NULL THEN SUM(`raid_value`) ELSE 0 END) AS dkp_get,
(CASE WHEN SUM(`item_value`) IS NOT NULL THEN SUM(`item_value`)ELSE 0 END) AS dkp_pay
FROM `dkp_chars`

LEFT JOIN `dkp_chars_raid` ON dkp_chars.char_id = dkp_chars_raid.char_id
LEFT JOIN `dkp_chars_item` ON dkp_chars_item.raid_id =  dkp_chars_raid.raid_id

LEFT JOIN `dkp_items` ON dkp_chars_item.item_id = dkp_items.item_id
LEFT JOIN `dkp_raids` ON dkp_chars_raid.raid_id = dkp_raids.raid_id

WHERE dkp_chars.char_id = '1' GROUP BY `char_id`

So gehts leider nicht da kommt

PHP:
char_id 	last_raid 	dkp_get 	dkp_pay 
1	1199645221	1005	-600

raus und eigentlich solte

PHP:
char_id 	last_raid 	dkp_get 	dkp_pay 
1	1199645221	405	-180

raus kommen.

die zwei einzelen Querys funktioniern ja

PHP:
SELECT dkp_chars.char_id, (

CASE WHEN `raid_date` IS NOT NULL 
THEN `raid_date` 
ELSE 0 
END 
) AS `last_raid` , (

CASE WHEN SUM( `raid_value` ) IS NOT NULL 
THEN SUM( `raid_value` ) 
ELSE 0 
END 
) AS dkp_get
FROM `dkp_chars` 
LEFT JOIN `dkp_chars_raid` ON dkp_chars.char_id = dkp_chars_raid.char_id
LEFT JOIN `dkp_raids` ON dkp_chars_raid.raid_id = dkp_raids.raid_id
WHERE dkp_chars.char_id = '1'
GROUP BY `char_id` 
LIMIT 0 , 30

ergebnis
PHP:
char_id 	last_raid 	dkp_get 
1	1199645221	405


PHP:
SELECT dkp_chars.char_id, (

CASE WHEN SUM( `item_value` ) IS NOT NULL 
THEN SUM( `item_value` ) 
ELSE 0 
END 
) AS dkp_pay
FROM `dkp_chars` 
LEFT JOIN `dkp_chars_item` ON dkp_chars.char_id = dkp_chars_item.char_id
LEFT JOIN `dkp_items` ON dkp_chars_item.item_id = dkp_items.item_id
WHERE dkp_chars.char_id = '1'
GROUP BY `char_id`

ergebnis
PHP:
char_id 	dkp_pay 
1	-180

ich komm nicht drauf wie ich die Joins anordnen muss das es funktioniert
 
Zuletzt bearbeitet:
Hallo,

ähm wenn du MySQL 5 einsetzt erstell doch mal einen View der schon mal eine korrekte "Teilwert" Ausgabe bringt.
Anschließen baust du den View dann in eine weitere Abfrage ein die dann die gesamt DKP berechnet.



For the horde....
 
momentan lass ich mir das mit php dann zusammen ausgeben aber ich hab da das porblem das ich nicht so richtig sotieren kann.

ich hab 3 werte die ich ausrechnen lassen muss einmal + dkp dann - item dkp und dann noch +- manuelle korektur = wert

da diese 3 werte in 3 tabellen sind und unterschiedlich oft vorkommen können hab ich da das problem.

brauchte quasi ne verknüpfung von den 3 tabellen. habe 2 zwischen tabellen und danach die tabelle die den wert enthält.

Prinzip von dkp_char ausgehend.

dkp_char
|
|----- dkp_char_item --- dkp_item
|
|------ dkp_char_raid --- dkp_raid
|
|----- dkp_korektur
 
Hallo ArtusPendragon,

wenn deine beiden einzelnen Querys funktionieren, dann brauchst du die doch nur noch miteinander verbinden.
Das machst du dann aber nicht in einem einzelnen Select, sondern deine beiden Querrys benutzt du als Subselects.

Code:
Select * from
    (   SELECT dkp_chars.char_id, (
        
        CASE WHEN `raid_date` IS NOT NULL 
        THEN `raid_date` 
        ELSE 0 
        END 
        ) AS `last_raid` , (
        
        CASE WHEN SUM( `raid_value` ) IS NOT NULL 
        THEN SUM( `raid_value` ) 
        ELSE 0 
        END 
        ) AS dkp_get
        FROM `dkp_chars` 
        LEFT JOIN `dkp_chars_raid` ON dkp_chars.char_id = dkp_chars_raid.char_id
        LEFT JOIN `dkp_raids` ON dkp_chars_raid.raid_id = dkp_raids.raid_id
        WHERE dkp_chars.char_id = '1'
        GROUP BY `char_id` 
        LIMIT 0 , 30  
    ) Q1 
inner join 
    (   SELECT dkp_chars.char_id, (
        
        CASE WHEN SUM( `item_value` ) IS NOT NULL 
        THEN SUM( `item_value` ) 
        ELSE 0 
        END 
        ) AS dkp_pay
        FROM `dkp_chars` 
        LEFT JOIN `dkp_chars_item` ON dkp_chars.char_id = dkp_chars_item.char_id
        LEFT JOIN `dkp_items` ON dkp_chars_item.item_id = dkp_items.item_id
        WHERE dkp_chars.char_id = '1'
        GROUP BY `char_id`  
    ) Q2 
ON Q1.char_id = Q2 .char_id
 
also das ist ja sowas von geil. hab den Querry noch um paar sachen erweitert und das ist genau das was ich gesucht habe.

Super hilfe hier Danke Bernd1984
 
Zurück