# mysql - SHOW COLUMNS FROM table LIKE ...



## sakana (31. Juli 2011)

Hallo liebe Forenmember,
ich ersuche um eine Möglichkeit die Ausgabe von "SHOW COLUMNS..." nach eigenem System zu sortieren.

Grundlage:
1. In der Datenbank Kontaktdaten gibt es die Felder Privat, Dienstlich, Mobil und Email
2. Die Datenbank ist mittel alter Table erweiterbar ( also einfügen Privat2, Email3 etc)

Nun die Fragestellung:

Wie kann ich mysql anweisen zunächst SHOW COLUMNS FROM Kontaktdaten LIKE "P%" dann LIKE "D%" etc.?
Da es sich um eine vom User erweiterbare Datenbank handelt sollen gleiche Columns nacheinander ausgegeben werden. Sortieren nach Alphabet ist keine ideale Lösung für mich. Den Umweg über ein "key" würde ich gerne vermeiden.

Der CODE:

```
$sql3 = 'SHOW COLUMNS FROM ma_Kontaktdaten WHERE FIELD LIKE "P%"';
$res3 = $db->query($sql3);
$a = 0;
while($row3 = $res3->fetch_assoc()) {
	$sql4 = 'SELECT '.$row3['Field'].' FROM Kontaktdaten WHERE ma_id = "'.$ma_id.'"';
	$res4 = $db->query($sql4);
	$row4 = $res4->fetch_assoc();
	$field = $row3['Field'];
	if($field != 'ma_id') {
		$a++;
		if(($row4[$field] != '') OR ($row3['Field'] == 'Privat') OR ($row3['Field'] == 'Dienstlich') OR ($row3['Field'] == 'Mobil') OR ($row3['Field'] == 'Email')) {
			echo '<td style="border-right: 0; visibility:visible">'.$field.'</td><td style="border-left: 0"><input type="text" name="kontakt['.$field.']" value="'.$row4[$field].'" /></td>';
		}
		if($a > 1) { echo '</tr><tr>'; $a=0;}
	}
}
```

Die Sortierung:
1. LIKE "PRIVAT%"
2. LIKE "DIENSTLICH%"
3. LIKE "Mobil%"
4. LIKE "Email%"
5. der Rest

Im Voraus vielen herzlichen Dank an die vielen engagierten Helfer, hat mir bereits sehr oft geholfen dank der SuFu ;-)

Gruß Sakana


----------



## SeeKing (2. August 2011)

SHOW COLUMNS ist hier meiner Meinung nach der komplett falsche Ansatz....
SHOW COLUMNS bzw. die MySQL Meta Tables sind für Administrative Aufgaben gedacht.

In solchen Anwendungsfällen löst man benötigte Felder n:m auf und macht daraus 2 Tabellen eine für "Spaltennamen" die andere für die eigentlichen "Spaltenwerte" und joint anschließend. Dann gehen auch solche Scherze....


----------



## Nico Graichen (2. August 2011)

Hi

Mach doch 5 Abfragen mit dem jeweiligen Filter und verknüpf sie per UNION


----------



## chibisuke (2. August 2011)

Benutz dafür einfach nicht SHOW COLUMNS sondern die information_schema tabellen.

```
SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = 'DBName' AND TABLE_NAME = 'ma_Kontaktdaten' AND COLUMN_NAME LIKE 'P%'
```

und nun kannst du die einelnen abfragen einfach mit unions zusammen führen.

```
SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = 'DBName' AND TABLE_NAME = 'ma_Kontaktdaten' AND COLUMN_NAME LIKE 'P%'
UNION ALL 
SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = 'DBName' AND TABLE_NAME = 'ma_Kontaktdaten' AND COLUMN_NAME LIKE 'D%'
UNION ALL 
...
```


----------



## sakana (3. August 2011)

Guten Morgen Nico und Chibisuke und Seeking
habs zwar noch nicht probiert, aber klappt sicher, super von euch beiden. Herzlichen Dank. Manchmal kommt man auf die einfachsten Sachen nicht 
Naja, wenn man sich mehrere Jahre nicht mehr mit proggen beschäftig hat...

Gruß Sakana


----------



## vandamp (9. August 2011)

du könntest es auch in einem Statement machen, wenn du dir eine Sortierhilfe baust -  weiß nicht was du vor hast aber die Abbildung  von n:m mit einer extra Tabelle ist sicher besser.


```
SELECT
*
case when xx LIKE "PRIVAT%" then 1 
        when xx LIKE "DIENSTLICH%" then 2
        when xx LIKE "Mobil%" then 3
        when xx LIKE "Email%" then 4 else 5 end as Sort
FROM 
....
ORDER BY
Sort
```


----------

