thealex
Goto Top

Array aus Datenbankabfrage zusammenfassen uns sortieren

Hallo Liebe Administrator.de Community,

Ich stehe vor einem Problem das Array aus meiner Datenbankabfrage zusammenzufassen und sortiert ausgeben zu lassen.

Hier mal ein Bild der Datenbank:
database

Das Array das meine Datenbankabfrage zurück gibt sieht so aus:

Array
(
     => Array
        (
            [mitarbeiter] => Administrator
            [cal_day] => 1
            [ma_wish] => Dienst
            [mid] => 1
        )

    [1] => Array
        (
            [mitarbeiter] => Administrator
            [cal_day] => 4
            [ma_wish] => Frei
            [mid] => 1
        )

    [2] => Array
        (
            [mitarbeiter] => Administrator
            [cal_day] => 6
            [ma_wish] => Frei
            [mid] => 1
        )

    [3] => Array
        (
            [mitarbeiter] => Administrator
            [cal_day] => 9
            [ma_wish] => Dienst
            [mid] => 1
        )

    [4] => Array
        (
            [mitarbeiter] => Administrator
            [cal_day] => 12
            [ma_wish] => Dienst
            [mid] => 1
        )

    [5] => Array
        (
            [mitarbeiter] => Administrator
            [cal_day] => 18
            [ma_wish] => Frei
            [mid] => 1
        )

    [6] => Array
        (
            [mitarbeiter] => Administrator
            [cal_day] => 22
            [ma_wish] => Dienst
            [mid] => 1
        )

    [7] => Array
        (
            [mitarbeiter] => Administrator
            [cal_day] => 24
            [ma_wish] => Dienst
            [mid] => 1
        )

    [8] => Array
        (
            [mitarbeiter] => Administrator
            [cal_day] => 27
            [ma_wish] => Frei
            [mid] => 1
        )

    [9] => Array
        (
            [mitarbeiter] => Administrator
            [cal_day] => 30
            [ma_wish] => Frei
            [mid] => 1
        )

    [10] => Array
        (
            [mitarbeiter] => testuser
            [cal_day] => 3
            [ma_wish] => Dienst
            [mid] => 2
        )

)

Ich benötige jetzt ein array mit dem es mir möglich ist ein array zu erzeugen das so aussieht:
array(
    [mid-des-users] => Array
        (
            [mitarbeiter] => name
            [dienst] => die cal_day's wenn ma_wish = dienst)  
            [frei] => die cal_day's wenn ma_wish = frei)  
            [mid] => 2
        )
       )

Bin schon seit tagen am testen und tüffteln habe jedeoch noch keine möglichkeit gefunden um dies zu bewerkstelligen.

Über jede Hilfe und jeden Tipp bin ich dankbar!

Content-Key: 365744

Url: https://administrator.de/contentid/365744

Printed on: April 25, 2024 at 07:04 o'clock

Member: em-pie
em-pie Feb 22, 2018 at 13:51:35 (UTC)
Goto Top
Moin,

warum erledigst du das nicht direkt mit der SQL-Abfrage, statt das nachträglich "umbiegen" zu wollen?

Stichwort Inner Join

select
  tbl1.name, tbl1.cal_days as "dienst", tbl2.cal_days as "frei"  
 From 
 (select name, cal_year, cal_mon, Count(cal_days) as cal_days, 'dienst' as wish from table where ma_wish =  "dienst" group by name, cal_year, cal_mon) as tbl1  
Inner join
 (select name, cal_year, cal_mon, Count(cal_days) as cal_days, 'frei' as wish from table where ma_wish =  "frei" group by name, cal_year, cal_mon) as tbl2 on tbl1.name = tbl2.name  

Gruß
em-pie
Member: TheAlex
TheAlex Feb 22, 2018 at 14:25:48 (UTC)
Goto Top
Und mit dieserAbfrage werden auch alle cal_day nacheinander aufgelistet die abgefragt werden wenn sie der selben kategorie(ma_wish) angehören?
Mitglied: 135333
135333 Feb 22, 2018 updated at 15:29:28 (UTC)
Goto Top
Erst mit array_unique alle Eindeutigen ma_wish Werte holen und dann in einer Schleife das Array erneut filtern mit array_filter

Beispiel:
foreach(array_unique(array_column($array,'ma_wish')) as $cat){  
	echo "Category '$cat':<br />";  
	foreach($array as $user){
		if($user['ma_wish'] == $cat){  
			echo $user['mitarbeiter'] . "<br />";  
		}
	}
}
Gruß Snap
Member: TheAlex
TheAlex Feb 22, 2018 at 15:01:14 (UTC)
Goto Top
select
  tbl1.mitarbeiter, tbl1.cal_day as 'dienst', tbl2.cal_day as 'frei'  
 From 
 (select mitarbeiter, cal_day, implode(', ', 'cal_day') as cal_day from ma_wishes where ma_wish ='Dienst' group by mitarbeiter, cal_day, cal_mon) as tbl1  
Inner join
 (select mitarbeiter, cal_day, implode(', ', 'cal_day') as cal_days from ma_wishes where ma_wish =  'Frei' group by mitarbeiter, cal_day, cal_mon) as tbl2 on tbl1.mitarbeiter = tbl2.mitarbeiter  

Habe den so angepasst, nur funktioniert implode ja nicht in einem query^^
Member: em-pie
em-pie Feb 22, 2018 at 15:10:51 (UTC)
Goto Top
Was willst du denn mit implode inhaltlich bewerkstelligen (also was implode() macht, weiss ich)?
Willst du dann in Spalte "dienst" alle Tage aneinandergereiht haben, an denen der MA "Dienst" hat und in Spalte "frei" dann selbiges, nur für die avisierten freien Tage?
Quasi:

NAME | DIENST | FREI
Max Mustermann | 1,12,13,24,25,29 | 2,13,19,27,28
Gisela Mustermann | 2,13,14,26,27,28 | 1,10,19,25,30
Member: TheAlex
TheAlex Feb 22, 2018 at 15:31:05 (UTC)
Goto Top
Genau das war meine Idee.

Nur kam ich nicht weiter damit.
Member: em-pie
em-pie Feb 22, 2018 at 15:58:17 (UTC)
Goto Top
Dann beschäftige dich mal hiermit:
https://www.mssqltips.com/sqlservertip/2914/rolling-up-multiple-rows-int ...
http://carlosferreira.com/how-to-combine-values-from-multiple-rows-of-a ...

Stichwörter (für die Nachwelt hier):
  • XML-Path
  • STUFF

scheint ja genau das zu sein, was du willst. Du musst dann vermutlich nur mit Gruppierungen "herumspielen"....

Du müsstenst dann nur mal nach der Syntax für MySQL suchen....
Member: TheAlex
TheAlex Feb 22, 2018 updated at 17:34:32 (UTC)
Goto Top
em-pie wäre es möglich mir ein lauffähiges beispiel zu erstellen? Ich lerne leider nicht gut in der Theorie, doch was ich gesehen habe verstehe und lerne ich schnell.

$stmt = $this->conn->prepare("select  
  tbl1.mitarbeiter, tbl1.cal_day as 'dienst', tbl2.cal_day as 'frei'  
 From 
 (select mitarbeiter, mid, cal_day from ma_wishes where ma_wish ='Dienst' group by mid ) as tbl1  
Inner join
 (select mitarbeiter, mid, cal_day from ma_wishes where ma_wish ='Frei' group by mid) as tbl2 on tbl1.mitarbeiter = tbl2.mitarbeiter");  

Das derzeit der Query, allerdings gibt er mir nur einen eintrag aus. Der zweite user der in der DB steht fehlt?!?

Array
(
     => Array
        (
            [mitarbeiter] => Administrator
            [dienst] => 1
            [frei] => 4
        )

)