tsunami
Goto Top

Spalten Splitten und als normale Zeile ausgeben

Hallo,
ich brauche einen Ansatz. geht um php/mysql.

Also ich habe eine Tabelle:
id, Datum, Nummer,Anbieter

Nun habe ich das Problem, dass bei manchen Datensätzen gewollt 2 Wete durch Semikolon getrennt drinne stehen. Die Sollen mit ausgegeben werden.
Bsp.:

1 | 2018.08.08 12345 | 4

2 | 2018.08.08 |12346 | 4

3 | 2018.08.08 |12347 | 6

4 | 2018.08.08 |12349 | 7

5 | 2018.08.08 |123415 | 6

6 | 2018.08.08 |12345;3334532;88665 | 7

7 | 2018.08.08 |123411;3334542;| 2

Rauskommen soll zum Schluss eine Übersicht Wieviel Vorgänge pro Anbieter pro Datum. Normalerwweise mit count und group by.
Aber bei den Ids 6 und 7 habe ich beispielhaft das Proble, dass ich die Nummer aufspiltten muss.
Eine Idee, ist das ganze zu splitten und dann in eine tmp Table rein zu packen und diese dann wie gehabt ab zu fragen. Andere Ide, mit if zu arbeiten und SUBSTRING_INDEX(SUBSTRING_INDEX(TrackingID, ';', 1), ';', -1) as first,
SUBSTRING_INDEX(SUBSTRING_INDEX(TrackingID, ';', 2), ';', -1) as last

zu arbeiten. Nur da die Anzahl der Nummern nicht fix, ist, müsste ic da erst wieder die ";" zählen und dann die Abfragen in einer Schleife machen. Und das ist doch auch Käse.
Irgendwer eine Idee?
mfG
tsunami

Content-Key: 387234

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

Ausgedruckt am: 19.03.2024 um 08:03 Uhr

Mitglied: erikro
erikro 21.09.2018 um 15:05:03 Uhr
Goto Top
Moin,

Irgendwer eine Idee?

Die Datenbank ordentlich normalisieren. Alles andere ist Murks. face-wink

Das Feld in ein Array schreiben und dann die Länge des Arrays auslesen. PHP ist lange her. Aber, wenn ich mich recht erinnere, hieß die Funktion, die das macht, auch in der Sprache split.

Liebe Grüße

Erik
Mitglied: tsunami
tsunami 22.09.2018 um 12:28:14 Uhr
Goto Top
Danke!
Mitglied: erikro
Lösung erikro 24.09.2018 um 08:40:15 Uhr
Goto Top
Gerne. Wenn's geholfen hat, machst Du dann auch noch ein "Gelöst" an die Frage?
Mitglied: tsunami
tsunami 24.09.2018 um 09:35:20 Uhr
Goto Top
So ganz gelöst habe ich es noch nicht. Moin erstmal.

Über Sinn und Unsinn zu diskutieren macht keinen Sinn, die DB ist nicht von mir.

Array ist auch mein Ansatz gewesen, nur was mache ich mit den anderen Spalten?
Wenn der Datensatz o aussieht:
6 | 2018.08.08 |12345;3334532;88665 | 7

soll natürlich rauskommen:

6 | 2018.08.08 | 12345 | 7
6 | 2018.08.08 | 3334532 | 7
6 | 2018.08.08 | 88665 | 7

Ich könnte natürlich die fixen Werte jeweils in eine Var schreiben, dass Array durchlaufen lassen. Danach dei Var löschen.
Also was weiß ich:
$x=6
$datum =2018.08.08;
Dann mit for each das array durchlaufen und dann die var löschen....
Mitglied: erikro
erikro 24.09.2018 um 09:47:57 Uhr
Goto Top
Moin,

Zitat von @tsunami:
6 | 2018.08.08 | 12345 | 7
6 | 2018.08.08 | 3334532 | 7
6 | 2018.08.08 | 88665 | 7

Ich könnte natürlich die fixen Werte jeweils in eine Var schreiben, dass Array durchlaufen lassen. Danach dei Var löschen.
Also was weiß ich:
$x=6
$datum =2018.08.08;
Dann mit for each das array durchlaufen und dann die var löschen....

Genau so. Anders wirst Du nicht an das Ergebnis kommen. Dabei musst Du nicht unbedingt die drei Werte, die bei den DS gleich sind, in eine Variable schreiben. Du kannst sie ja auch direkt aus dem aktiven Datensatzobjekt auslesen.

hth

Erik
Mitglied: 137289
Lösung 137289 24.09.2018 aktualisiert um 10:22:29 Uhr
Goto Top
So?
<?php
function connect(){
	$DB_HOST = 'localhost';  
	$DB_NAME = 'MYDB';  
	$DB_USER = 'MYUSER';  
	$DB_PASSWORD = 'MYPASSWORD';   
	$db = new PDO('mysql:host='.$DB_HOST .';dbname='.$DB_NAME.';charset=utf8', $DB_USER, $DB_PASSWORD,array(PDO::ATTR_EMULATE_PREPARES => false, PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));  
	return $db;
}
$db = connect();
$result = $db->query('Select * From MEINETABELLE');  
echo "<table><tr><th>ID</th><th>Datum</th><th>Nummer</th><th>Anbieter</th></tr>";  
foreach($result as $row){
	$numbers = preg_split('/;/',$row['Nummer'],-1,PREG_SPLIT_NO_EMPTY);  
	foreach($numbers as $number){
		echo "<tr><td>" . $row['id'] . "</td><td>" . $row['Datum'] . "</td><td>" . $number . "</td><td>" . $row['Anbieter'] . "</td></tr>";  
	}
}
echo "</table>";  
?>

DB:

screenshot

Ergebnis:

screenshot

Gruß speedlink
Mitglied: erikro
Lösung erikro 24.09.2018 um 12:52:03 Uhr
Goto Top
So meinte ich das. face-wink
Mitglied: tsunami
tsunami 24.09.2018 um 18:35:03 Uhr
Goto Top
Hi,
vielen Dank. Ich habs nun selber etwas anders gelöst. Habe die Nummer normal ausgelsen und dann geschaut ob ";" vorkammt. Wenn ja in ein array gepackt, die anderen Werte in eine Var und das Array per foreach durchlaufen und uausgegeb., Dann die Var auf 0 gesetzt.
Wenn kein ";" vorkommt normale Ausgabe.
OK mit rexExs stehe ich etwas auf Kriegsfuß und preg_split annte ich nicht.

Gruß
tsunami