Seite 1 von 2

SQL Abfrage Allgemein

Verfasst: 02.11.2022 22:14
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.

Re: SQL Abfrage Allgemein

Verfasst: 02.11.2022 22:29
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.

Re: SQL Abfrage Allgemein

Verfasst: 02.11.2022 22:55
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.

Re: SQL Abfrage Allgemein

Verfasst: 02.11.2022 23:22
von IMC
Dann ist vielleicht dies deine Lösung.
https://www.gutefrage.net/frage/freie-n ... r-11280257

Re: SQL Abfrage Allgemein

Verfasst: 03.11.2022 08:11
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.

Re: SQL Abfrage Allgemein

Verfasst: 03.11.2022 16:50
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.

Re: SQL Abfrage Allgemein

Verfasst: 03.11.2022 19:48
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

Re: SQL Abfrage Allgemein

Verfasst: 03.11.2022 20:41
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.

Re: SQL Abfrage Allgemein

Verfasst: 03.11.2022 22:23
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.

Re: SQL Abfrage Allgemein

Verfasst: 03.11.2022 22:57
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.