portseven: Doppelte Einträge verhindern (SQL)

Tag,

weiß eventuell Jemand wie man doppelte Einträge verhindern kann per SQL im PHP-Code?

Bild:

<?php

	$stmt = $pdo->prepare("
	SELECT
	user.id,
	user.username,
	user.image,

	user_has_job.user_id,
	user_has_job.job_id,

	user_job.id,
	user_job.Job
	
	FROM user_has_job
	
	LEFT JOIN user
	ON user_has_job.user_id = user.id
	
	LEFT JOIN user_job
	ON user_has_job.job_id = user_job.id
	
	");

	if(!$stmt->execute()) {
	print_r($stmt->errorInfo());
	}
	
?>
  1. Hallo portseven,

    weiß eventuell Jemand wie man doppelte Einträge verhindern kann per SQL im PHP-Code?

    bin mir nicht sicher ob du das auch so meinst... doppelte Einträge(also beim Eintragen)verhindern oder doppler einfach nicht ausgeben lassen, worauf dein Select hinweisen würde.

    Also letzteres lässt sich mit DISTINCT verhindern. Ersteres wäre schon im Aufbau am sinnvollsten, durch unique.

    Bin allerdings schon etwas eingerostet in Sachen Mysql und auch nicht sicher ob das übergreifende SQL Anweisungen, oder nur mysql spezifisch, sind.

    Gruss
    Henry

    1. Hi,

      damit meine ich , das jeder User nur einmal vorkommen darf. Im Bild steht ja 2 mal der Username: anna123

      1. Hallo portseven,

        damit meine ich , das jeder User nur einmal vorkommen darf. Im Bild steht ja 2 mal der Username: anna123

        Du möchtest sprechende Primärschlüssel verwenden.

        Bis demnächst
        Matthias

        --
        Rosen sind rot.
  2. Tach!

    weiß eventuell Jemand wie man doppelte Einträge verhindern kann per SQL im PHP-Code?

    Mit Unique Constraints. Man legt einen UNIQUE Index auf das entsprechende Feld oder über mehrere Felder, die die Eindeutigkeit sicherstellen sollen (ein gemeinsamer Index, nicht einzelne Indexe auf jedes Feld).

    Wenn du hingegen doppelte Einträge in der Ergebnismenge meinst, dann solltest du kartesische Produkte vermeiden. Das heißt, dass du nur solche Joins nimmst, die in den verknüpften Tabellen nur jeweils einen Datensatz pro Join-Condition ergeben. Oder Correlated Subquerys in der SELECT-Klausel, wenn aus der anderen Menge nur ein einzelner Wert pro Datensatz der Hauptquery genommen werden soll.

    Und dann war da noch das DISTINCT, um Dopplungen aus Ergebnismengen zu entfernen. Nimm's nicht! Beziehungsweise versuch es zu vermeiden. Schreib stattdessen die Query so um, dass gar nicht erst ein kartesisches Produkt entstehen, so dass die Notwendigkeit des Rauszukürzen gar nicht erst entsteht.

    dedlfix.

    1. Mein Fehler. Hab mich nicht richtig ausgedrückt sorry.

      Also ich habe einmal die Spalte:

      user_job: -id -Job

      user_has_job: -user_id -job_id

      user: id username

      So jetzt habe ich alle Beiträge ausgewählt , wo der User ein Job hat. Jetzt hat ein User 2 Jobs und ich wollte es zusammenfassen. Das nicht Anna123 2x angezeigt wird sondern einmal. Mit SQL meinte ich den PHP-Code wie "SELECT/DISTINCT or Whatever".

      In diesem Fall brauche ich kein Primary Key, da die User mehrere Jobs haben können.

      lg

      1. Tach!

        So jetzt habe ich alle Beiträge ausgewählt , wo der User ein Job hat. Jetzt hat ein User 2 Jobs und ich wollte es zusammenfassen. Das nicht Anna123 2x angezeigt wird sondern einmal wie oben im Bild.

        Dann ist es günstiger, nicht nach den Jobs zu fragen, sondern nur ob Jobs für den User existieren. Anscheinend interessieren dich die Job-Daten ja nicht wirklich, wenn du von zwei nur einen haben möchtest.

        Wobei, es kommt darauf an, was du unter zusammenfassen verstehst. Fragen exakt zu formulieren ist der halbe Weg zur Lösung. Möchtest du nur das "ob" wissen oder deren Anzahl, oder andere Daten, die man (auf welche Weise auch immer) zusammenfassen kann?

        Mit SQL meinte ich den PHP-Code wie "SELECT/DISTINCT or Whatever".

        PHP ist für das Problem nicht notwendig. Du kannst das passende Ergebnis direkt aus dem DBMS bekommen.

        dedlfix.

        1. Die Jobs zusammenfassen die jeder User hat.

          Beispiel bei Anna:

          Anna hat 2 Jobs.

          Im Bild oben:

          Anna123 Job 1: | Anna123 Job 2

          Ich möchte es so haben: Anna123 Job: 1 & 2.

          1. Tach!

            Die Jobs zusammenfassen die jeder User hat.

            Bitte, präzise Formulierungen muss mal als Programmierer beherrschen, weil man sie braucht, um präzise die Programmschritte erstellen zu können, die zum gewünschten Ergebnis führen. Und auch, um sein Problem nachvollziehbar beschreiben zu können.

            Ich möchte es so haben: Anna123 Job: 1 & 2.

            Heißt das jetzt, dass du eine Liste der Job-Nummern (IDs oder welche Nummern auch immer) getrennt durch Kaufmanns-Und haben möchtest? Wenn ja, dann kann man die über GROUP_CONCAT() bekommen. Erstell dir zunächst eine separate Abfrage, die mittels GROUP_CONCAT() und einer Gruppierung über die User-ID diese Liste für alle Einträge der Job-Tabelle erzeugt. In einem zweiten Schritt nimmst du diese Query und fügst sie als Subquery in der SELECT-Klausel der ersten ein. Erweitere aber die Subquery um ein WHERE user_id = hauptquery_table.id. (Die Bezeichner sind hier nur beispielhaft benannt).

            dedlfix.

            1. Danke dir. Werde es jetzt erstmal bisschen rumbasteln & es ausprobieren wie du es erwähnt hast. Danke erstmal für die Hilfe & Tipps!