SQL Abfrage Allgemein

Fragen zu allen Themen rund ums Programmieren außerhalb von phpBB können hier gestellt werden - auch zu anderen Programmiersprachen oder Software wie Webservern und Editoren.
Benutzeravatar
chris1278
Mitglied
Beiträge: 3532
Registriert: 12.11.2007 06:20
Wohnort: Euskirchen
Kontaktdaten:

SQL Abfrage Allgemein

Beitrag von chris1278 »

Hallo also ich habe für eine Extension eine Tabelle erstellt wo ich Inhalte speichere und abrufe. Das funktioniert aus soweit gut. Bin mit meiner Extension auch soweit fertig. Es geht sich hier um eine Allgemeine Frage da ich gern einige Funktionsweisen der Extension verbessern möchte.

Meine Tabelle sieht im Moment so aus:

| id| wert1| wert2 usw.|
|:------:|:------:|:------:|
| x | x | x |

Dies ist natürlich nur bildlich dargestellt.

Es geht mir um folgendes.

Meine Extension erhöht den Wert der Spalte [*]id immer um einen wenn man einen neuen Eintrag anlegt aber da liegt eigentlich das Problem wenn man eine Zeile mittendrin löscht stimmt die abfrage für die neu angelegten IDs nicht mehr und es knallt bei gleicher id.

Meine Überlegung ist es eine abfrage zu generieren die die IDs nach einander auflistet und dann dem kleinsten gefunden wert stoppt dort den wert 1 addiert und dies als neue id einträgt.

Nur leider weis ich nicht so recht wo ich da ansetzen muss. ich kann zwar mit count im sql die einträge zählen würde mein Problem aber nicht lösen.
Benutzeravatar
IMC
Mitglied
Beiträge: 541
Registriert: 25.11.2018 20:32
Wohnort: Lüneburg
Kontaktdaten:

Re: SQL Abfrage Allgemein

Beitrag von IMC »

Ich kenne das so dass man den Job mit den ID's der Datenbank überlässt.
https://dev.mysql.com/doc/refman/8.0/en ... ement.html
https://www.w3schools.com/sql/sql_autoincrement.asp

Dadurch ist es nicht möglich das eine ID identisch vergeben wird.
Gruß, Thorsten
Benutzeravatar
chris1278
Mitglied
Beiträge: 3532
Registriert: 12.11.2007 06:20
Wohnort: Euskirchen
Kontaktdaten:

Re: SQL Abfrage Allgemein

Beitrag von chris1278 »

Ja das hab ich auch als notlösung. Damit hat das "knallen" aufgehört.

Alsomal zur verdeutlichumg hier meine tabellen:

Code: Alles auswählen

return [
			'add_tables' => [
				$this->table_prefix . 'chris1278_social' => [
					'COLUMNS' => [
						'var_social_index'			=> ['UINT', null, 'auto_increment'],
						'var_social_box_nr'			=> ['VCHAR:255'		, ''],
						'var_social_icon_url'		=> ['VCHAR:255'		, ''],
						'var_social_ficon_url'		=> ['VCHAR:255'		, ''],
						'var_social_url'			=> ['VCHAR:255'		, ''],
						'var_social_url_enable'		=> ['VCHAR:255'		, ''],
						'var_social_name'			=> ['VCHAR:255'		, ''],
					],
					'PRIMARY_KEY' => [
						'var_social_index',
					],
				],
			],
		];
Ursprünglich war das feld var_social_box_nr der primär key. So nummeriert er die zeilen forlaufend und ich kann die box_nr frei verwenden.

Das eigentlich ziel ist folgendes:

Es wurde sagen wir 10 einträge generiert mit den var_social_box_nr Nummern 1 bis 10

Also etwa so:

1...
2...
3...
4...
5...
6...
7...
8...
9...
10...


Jetzt wird sagen wir mal Box nummer 5 gelöscht. Jetzt soll beim neu anleged wieder die freigewordende Nummer 5 verwendet werden. Ich Würde gern wissen wie ich eine abfrage gestalten kann womit ich diese frei nummer rausfiltern kann und diese in ein array einfüge was ich weiter verwenden kann. Beispiel so.


Prüfe 0 -> ist da = weiter
Prüfe 1 -> ist da = weiter
Prüfe 2 -> ist da = weiter
Prüfe 3-> ist da = weiter
Prüfe 4 -> ist da = weiter
Prüfe 5 -> ist da = array [] = '5'; Weiter zur nächsten aufgabe.

So in etwa.
Benutzeravatar
IMC
Mitglied
Beiträge: 541
Registriert: 25.11.2018 20:32
Wohnort: Lüneburg
Kontaktdaten:

Re: SQL Abfrage Allgemein

Beitrag von IMC »

Dann ist vielleicht dies deine Lösung.
https://www.gutefrage.net/frage/freie-n ... r-11280257
Gruß, Thorsten
Benutzeravatar
chris1278
Mitglied
Beiträge: 3532
Registriert: 12.11.2007 06:20
Wohnort: Euskirchen
Kontaktdaten:

Re: SQL Abfrage Allgemein

Beitrag von chris1278 »

Ok ich denke damit kann ich was anfangen. Das heißt wenn ich das richtig verstehe um bei meinem Beispiel zu bleiben, würde er wenn ich das mit der select min variante aufrufe bei gelöschter id 5 dann hochzählen und als Ergebnis die 4 ausspucken. wenn das so ist denk ich das ich damit was anfangen kann. werde das testen. Ich danke dir für den Hinweis.

@edit

Ok ich hab das getestet aber bringt nichts. das würde den kleinsten vorhandenen wert anzeigen. Und löst mein Problem leider nicht.
Benutzeravatar
IMC
Mitglied
Beiträge: 541
Registriert: 25.11.2018 20:32
Wohnort: Lüneburg
Kontaktdaten:

Re: SQL Abfrage Allgemein

Beitrag von IMC »

Ich habe es bei mir jetzt auch mal getestet.

Hier meine Datenbankabfrage:

Code: Alles auswählen

// Verbindung mit der Datenbank aufbauen
$mysqli_link = mysqli_connect($dbhost, $dbuser, $dbpasswd, $dbname);

// select min(nummer + 1) from tabelle where nummer + 1 not in (select nummer from tabelle)
$query_string = 'SELECT MIN(id + 1) FROM newsl_empfaenger WHERE id + 1 NOT IN (SELECT id FROM newsl_empfaenger)';

$result = mysqli_query($mysqli_link, $query_string);

var_dump(mysqli_fetch_array($result, MYSQLI_ASSOC));
Hier die Ausgabe:
array(1) { ["min(id + 1)"]=> string(2) "15" }

Die ID 15 ist bei mir die erste freie ID. Also funktioniert die Datenbankabfrage.

Edit:
Wahrscheinlich wird die Abfrage nicht erkennen wenn die ID 1 frei ist. Das solltest du einmal testen und dann gegebenenfalls dies in deinem Code mit einer extra Abfrage prüfen lassen.
Gruß, Thorsten
Benutzeravatar
Dr.Death
Moderator
Moderator
Beiträge: 17399
Registriert: 23.04.2003 08:22
Wohnort: Xanten
Kontaktdaten:

Re: SQL Abfrage Allgemein

Beitrag von Dr.Death »

Kleiner Tip:
IDs mit auto increments sollte man nicht neu benutzen wenn eine ID gelöscht wurde.

Das Vergeben von auto increment Werten überlässt man der Datenbank.
Ansonsten kann es ganz schnell passieren, das der SQL Code zwar auf xxx funktioniert aber auf yyy oder zzz nicht. (Tausche xxx,yyy und zzz wahllos gegen MySQL, PostgreSQL, Oracle....)

Ich hatte auch mal in meiner Extensions feste IDs zu Einträgen zugewiesen:

$sql_ary[] = ['team_id' => 1, 'team_name' => 'Mercedes F1 Team', 'team_img' => '', 'team_car' => '',];

Ich wollte, das die ID 1 das Team "Mercedes" ist.... das klappte soweit, bis ich anstelle einer MySQL/MariaDB eine PostgreSQL DB benutzt habe.
Da musste ich dann anschliessend die Autoincrements (Sequence Numbers) von Hand nachjustieren..... macht also mehr Arbeit bei jeder ID Anpassung.

Am besten also Einträge in die Tabelle ohne Angabe der ID vornehmen lassen....das können die Datenbank selbst regeln.

https://github.com/DrDeath/phpbb-ext-f1 ... 0646b4d836
Benutzeravatar
chris1278
Mitglied
Beiträge: 3532
Registriert: 12.11.2007 06:20
Wohnort: Euskirchen
Kontaktdaten:

Re: SQL Abfrage Allgemein

Beitrag von chris1278 »

Dr.Death hat geschrieben: 03.11.2022 19:48 Kleiner Tip:
IDs mit auto increments sollte man nicht neu benutzen wenn eine ID gelöscht wurde.
Nein darum nutze ich dafür eine separate id vergabe mit eigener spalte.
Benutzeravatar
IMC
Mitglied
Beiträge: 541
Registriert: 25.11.2018 20:32
Wohnort: Lüneburg
Kontaktdaten:

Re: SQL Abfrage Allgemein

Beitrag von IMC »

Dr.Death hat geschrieben: 03.11.2022 19:48 Das Vergeben von auto increment Werten überlässt man der Datenbank.
Dem kann ich nur zustimmen. Dies ist um so wichtiger wenn es Möglich ist dass gleichzeitige Zugriffe stattfinden können.
Bei der "Handvergabe" von ID's könnten dann Dopplungen entstehen.
Gruß, Thorsten
Benutzeravatar
chris1278
Mitglied
Beiträge: 3532
Registriert: 12.11.2007 06:20
Wohnort: Euskirchen
Kontaktdaten:

Re: SQL Abfrage Allgemein

Beitrag von chris1278 »

IMC hat geschrieben: 03.11.2022 22:23 Dies ist um so wichtiger wenn es Möglich ist dass gleichzeitige Zugriffe stattfinden können.
Bei der "Handvergabe" von ID's könnten dann Dopplungen entstehen.

Das ist ja das was ich bei meinem test rausgefunden habe. drum habe ich zwecks dieses problem ja eine spalte die mittels auto increment als index funktioniert. Diese tue ich weder auslesen noch bearbeiten.

So sieht das aus:
https://prnt.sc/StjwtokN84iL

bzw.

https://prnt.sc/4c20rmfawOu9

wobei die spalte var_social_index die auto increment funktion hat. Diese Spalte wird auch nicht bei mir im php Code ausgelesen oder sonstwas.

Ich spreche zue auswahl bearbeiten und löschen nur die werte in der var_social_box_nr an. Dementsprechend löscht er entweder den eintrag mit der entsprechenden nummer oder er ruft zum bearbeiten die daten der zeile (ohne var_social_index) ab und speichert diese dann.
Antworten

Zurück zu „Coding & Technik“