# (MySQL) Wenn 2 gleiche Werte, nur eine Ausgabe ?



## Ahmedo (9. Januar 2014)

Guten Abend, ich hätte da eine Frage 
Ich will in MySQL folgendes ausgeben:
Wenn es in der Spalte "title" bereits zB. dort schon den Titel "Hallo" gibt, kann es durchaus noch weitere Titel mit "Hallo" geben, aber ich will, dass dann nur einer von beiden ausgegeben wird, wie realisiere ich das ? (mit PHP).
Und wie wähle ich aus, welches dann angezeigt wird und welches nicht ? Gibt es überhaupt so eine Funktion ?

Ich bedanke mich im Voraus


----------



## Yaslaw (10. Januar 2014)

Ich verstehe die Frage nicht ganz.
Misnt du sowas wie ien DISTINCT um die Abfrage eindeutig zu machen?


----------



## tombe (10. Januar 2014)

Also wenn zufällig einer der vorhandenen Titel ausgegeben werden soll, kannst du es mit dieser Abfrage machen:


```
SELECT
    feld1, feld2, feld3
FROM
    tabelle
WHERE
    title = 'Hallo'
ORDER BY RAND()
LIMIT 1
```

Damit werden die vorhandenenen Einträge zufällig sortiert und nur einer davon ausgegeben.


----------



## Ahmedo (10. Januar 2014)

Fast, aber leider noch nicht ganz...
Ich erklär das nochmal besser bzw. versuch es besser zu erklären.
Also:
Ich habe mit einer Schleife (foreach) alle Titel ausgeben lassen. Wenn es nun 2 Einträge mit dem selben Titel gibt, soll nur einer von beiden angezeigt werden.

Der folgende Code würde (glaube ich) nicht funktionieren, weil 1. der Titel ja nicht immer nur "Hallo" ist (ich weiß, ich habs leider am Anfang doof erklärt) und 2. bei der Foreach-Schleife dann allgemein nur eins angezeigt wird, oder ?


```
SELECT
    feld1, feld2, feld3
FROM
    tabelle
WHERE
    title = 'Hallo'
ORDER BY RAND()
LIMIT 1
```

PS: So sieht mein PHP Code aus (Foreach-Schleife)


```
$ergebnis = $db->get( $prefix."artikel" );
 foreach( $ergebnis as $row )
```


----------



## tombe (10. Januar 2014)

Dann schau dir mal so wie es Yaslaw vorgeschlagen hat DISTINCT näher an.


----------



## Ahmedo (10. Januar 2014)

Okay, nun bin ich auf jeden Fall einen Schritt näher gekommen, jetzt wird nur ein Titel angezeigt, was auch genau richtig so ist.
Nun, ich will aber mehrere Spalten abfragen und dabei nur die Spalte "title" im Distinct haben.
Also das nun erschienende Problem ist folgendermaßen:
Wenn ich den Code nutze: 

```
$abfrage = "SELECT DISTINCT * FROM artikel";
```
Dann erscheint alles ganz normal, also da werden alle Titel angezeigt (also auch gleiche), was ich ja nicht will.
Beim folgenden Code:

```
$abfrage = "SELECT DISTINCT title FROM artikel";
```
Wird es eigentlich nun so angezeigt, wie ich es haben will. Naja fast. Nun erscheint halt der Titel auch wirklich nur einmal, ABER:
Z.B. die Spalte "desc" (für Description, also Beschreibung) erscheint nun nicht. Da steht zwar jetzt der Titel des Artikels nur einmal, aber die Beschreibung wird nicht angezeigt, oder der Verfasser (die Spalte autor) wird nun nicht angezeigt.

Was ich nun will: Ich will einfach, dass der Titel nur einmal erscheint, wobei aber auch z.B. die Beschreibung dabei ist oder der Autor bzw. den Verfasser,


----------



## tombe (11. Januar 2014)

Und was passiert wenn du GROUP BY nimmst.


```
SELECT autor, description, title FROM artikel GROUP BY titel
```

"desc" als Feldname würde ich nicht nehmen da dies eib Parameter zum Sortieren ist!


----------



## Ahmedo (11. Januar 2014)

tombe hat gesagt.:


> Und was passiert wenn du GROUP BY nimmst.
> 
> 
> ```
> ...



Danke, so klappt's.


----------



## Yaslaw (13. Januar 2014)

tombe, du soltest dich schämen ein solches SQL zu veröffentlichen.

Das ist eine Ausnutzung einer unschönen Eigenschaft von MySQL. Man sollte sie sich aber nbicht angwöhnen, da sie in fast allen anderen DBMS so nicht funktioniert.
In MySQL muss nicht jedes Feld in den GROUP BY Teil oder mit einer Gruppierungsfunktion gehandelt werden. In den anderen DBMS schon.
Ergo müsste dein SQL so aussehen (oder anderst gesagt, MySQL mach das daraus):

```
SELECT autor, description, title 
FROM artikel 
GROUP BY autor, description, title
```

Und das ist identisch mit

```
SELECT DISTINCT autor, description, title 
FROM artikel
```

Das Problem bei Ahmedos erstem Distinct-Versuch war, dass er auf * prüfte und nicht auf eine Feldauswahl.


----------



## tombe (13. Januar 2014)

Ich wüßte nicht warum ich mich schämen soll nur weil ich die Möglichkeiten nutze die DIESES System bietet.

MySQL bietet auch an anderer Stelle Möglichkeiten und Funktionen die ein anderes DBMS so nicht kennt oder eben anders löst. Soll ich sie deshalb alle nicht verwenden?

Du lieferst sicher zumindest fast immer tolle Lösungsvorschläge und du kennst dich sicher auch mehr als gut in zumindest den Bereichen PHP, MySQL aus. Aber einen solchen Kommentar zum Vorschlag eines anderen. Na ja.


----------



## Yaslaw (13. Januar 2014)

Nicht alles was ein DBMS Unterstützt sollte genutzt werden.
Das Auslassen der Felder in der Gruppierung macht das SQL auch unlogisch. Warum GROUP BY auf Titel und nicht auf Autor? Was passiert mit den anderen Feldern? 
Wir wissen es, jedoch jeder der wenig Ahnung hat, weiss es nicht. Es bleibt einfach Magic.

Es geht für mich in die gleiche Richtung wie unsauberen HTML-Code, dass von gewissen Browsern unterstützt wird.

Und sollte er mal das DBMS wechseln müssen, entstehen mit solchen Codes gleich als erstes Probleme. Besser man fängt gar nicht damit an.
Wer weiss, ev. kommt da MySQL in einer Zukünftigen Version dem Standard näher...

Gewisse Hoster stellen auf MariaDB um. Ob das dort auch erlaubt ist, weiss ich jetzt grad nicht.

Ich wollte dich nicht direkt angreifen, sondern mehr auf die Problematik von unsauberem Code aufmerksam machen.


----------

