Zelle mehrere Werte zuweisen Mysql
lima-city → Forum → Programmiersprachen → PHP, MySQL & .htaccess
abfragen
array
artikel
bedingung
befehl
beziehung
code
eintrag
folgenden abfragen
funktionieren
http
index
kategorie
semikolon
set
spalte
tabelle
url
zahl
zelle
-
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
Hört sich nach einer M:N Beziehung an. Dafür brauchst du eine weitere Tabelle, wo diese Beziehung zu 1:N und M:1 aufgelöst wird
Bsp.:
_Tabelle Artikel_ +----+---------+--------+ | ID | Artikel | .... | +----+---------+--------+ | 1 | Bsp. 1 | ... | | 2 | Bsp. 2 | ... | +----+---------+--------+ _Tabelle Kategorien_ +----+-----------+ | ID | Kategorie | +----+-----------+ | 6 | bla | | 7 | blubb | +----+-----------+ _Tabelle art_kat_ +--------+--------+ | art_id | kat_id | +--------+--------+ | 1 | 6 | | 1 | 7 | | 2 | 6 | +--------+--------+
Dann kannst du das so abfragen:
SELECT DISTINCT `Artikel`.* FROM `Artikel`,`art_kat` WHERE `Artikel`.`ID` = `art_kat`.`art_id` AND `art_kat`.`kat_id` = '6'
-
eigentlich wollte ich es nicht so kompliziert und es ist eigendlich nur für eine Zeille zwei Werte. Der Rest der Tabelle hat nur einen Wert. An der Abfrage möchte ich eigendlich nichts verändern.
Beitrag zuletzt geändert: 11.6.2011 23:42:01 von onlysteul -
hemiolos schrieb:
onlysteul schrieb:
und das erinnert einen an enum.
... Ich möchte gerne einer Zelle mehere Werte zuweisen ...
lg
Und wie soll das mit einem ENUM funktionieren?
Da kann man vodefinieren, welche Werte in der Spalte stehen können. Nach wie vor kann dies aber nur ein Wert sein. -
Hallo onlysteul,
eigentlich hat thomasba recht und Du solltest es über die m:n Beziehung lösen.
Ein bisschen tricksen könnte man aber schon. Aber nur, wenn Dein Kategorie-Feld ein Textfeld (Text, Varchar oder sowas) ist.
Dann kanst Du die Kategorien z.B. folgendermaßen speichern:
Das ermöglicht es dann den Datensatz über folgende Abfrage zu selektieren:_6; 7; ^^^----- Semikolon |'------ Zahl '------- Leerzeichen
Die Prozentzeichen sind Platzhalter (Wildcard-Character) für beliebig viele andere Zeichen.SELECT * FROM `artikel` WHERE `kategorie` LIKE '% 6;%' ^^^----- Semikolon |'------ Zahl '------- Leerzeichen
Das Leerzeichen und das Semikolon sind wichtig, damit man nicht mit Katgorien wie z.B. 66 oder 76 in konflikt kommt.
-
Wie sieht es denn eigentlich aus mit
SELECT * FROM `artikel` WHERE `kategorie` LIKE '6' OR `kategorie` LIKE '7'
???
MfG CnP -
thomasba schrieb:
wie wär's mit refman lesen (link habe ich geliefert), bevor man weitere unnötige fragen stellt?
Und wie soll das mit einem ENUM funktionieren?
Da kann man vodefinieren, welche Werte in der Spalte stehen können. Nach wie vor kann dies aber nur ein Wert sein.
mehrzahl und einzahl 'harmonisch' verschmolzen: 'welche Werte' <-> 'nur ein Wert'!
hmm!!?? welche werte können nur ein wert sein ... !!??
dass die formulierung von @onlysteul schwammig ist, must du sie auch noch krönen? und irgendwelche eingerauchte behaupten, lesen soll bilden ...
ich behaupte trotzdem, mit ENUM soll es SO funktionieren (wenn ich zwischen zelle und spalte nach eigener interpretation unterscheiden kann). und wofür er das braucht oder eben nicht, soll er entscheiden. oder aber kann er noch immer weiter fragen. wir können für ihn aber nicht.
lg
==== edit ====
@darkpandemic - warum enum modellieren, wenn enum schon zur verfügung steht? (das rad mal wieder erfunden. nur ein bisschen oval ist geraten.)
Beitrag zuletzt geändert: 12.6.2011 10:21:38 von hemiolos -
Wenn du eine feste Anzahl von Kategorien hast steht dir eine "gedachte" Flags-Enum zur Verfügung.
Du erstellst ein array in zwei varianten. Du weißt einmal jede kategorie (index) einer Zahl (value) zu und dann erstellst du das Array noch anders herrum (Kategorie als wert und zahl als index). Allerdings nicht 0, 1, 2, 3, ..., n, sondern nach dem Muster 2^0, 2^1, 2^2, 2^3, ..., 2^n. Das du Zwei arrays definierst ist wichtig um das mapping später einfach zu gestalten.
Das zuweisen dieses Zahlenmusters erlaubt dir die Zahlen auf binärebene zu vergleichen, da jeder Index eine einzigartige Position in der Bitmaske hat.
....
Somit kannst du nun mehrere Werte kombinieren und trotzdem identifizieren welche Kategorien alle gesetzt sind.
Beispiel:
Kat1 = 1 Kat2 = 8 => 0000 1001
Abfragen solltest du es dann etwa so können:
SELECT * FROM `artikel` WHERE (`kategorie` & 1) = 1
Das Binäre Und vergleicht hier die Bitmasken und setzt nur die Bits, welche in beiden vorhanden sind.
=>
. 0000 1001 & 0000 0001 ¯¯¯¯¯¯¯¯¯¯ 0000 0001
Im gegensatz dazu lassen sich die Masken per binären Oder ("|") kombieren:
=>
. 0000 0001 | 0000 1000 ¯¯¯¯¯¯¯¯¯¯ 0000 1001
Zuletzt noch der XOR ("^") Operator, dieser setzt nur werte, welcher nur in einer der Beiden bitmasken vorkommen
=>
. 0011 0110 | 0001 1011 ¯¯¯¯¯¯¯¯¯¯ 0010 1101
Jetzt nochmal das ganze als Codebeispiel.
[code]
$cvm = array("Kat1" => 1, "Kat2" => 2, "Kat3" => 4, "Kat4" => 8); //cvm = Category-Value-Mapping
$vcm = array(1 => "Kat1", 2 => "Kat2", 4 => "Kat3", 8 => "Kat4"); //vcm = Value-Category-Mapping
//Einträge Finden, welche Kategorie 1 gesetzt haben.
$sql = "SELECT * FROM myTable WHERE ('category' & 1) = 1
//Einen neuen Eintrag mit 2 oder mehr kategorien erstellen
$sql = "INSERT INTO myTable ('Name', 'Categories') VALUES ('newEntry', '".cvm["Kat1"] | cvm["Kat2"]."')";
//Einem Eintrag eine Kategorie hinzufügen
$sql_cond = " WHERE 'some_criteria' = 'uniqueValue'";
//Diese Bedingung muss einzigartig sein, da sonnst die Folgenden Abfragen, die Datenbank inkonsisten machen könnten.
$sql = "UPDATE myTable SET 'Categories' = (SELECT 'Categories' FROM myTable ".$sql_cond.") | ".cvm["Kat3"] . $sql_cond;
//Einem Eintrag eine Kategorie entfernen
$sql_cond = " WHERE 'some_criteria' = 'uniqueValue'";
//Diese Bedingung muss einzigartig sein, da sonnst die Folgenden Abfragen, die Datenbank inkonsisten machen könnten.
$sql = "UPDATE myTable SET 'Categories' = ( (SELECT 'Categories' FROM myTable ".$sql_cond.") & ".cvm["Kat3].") ^ ".cvm["Kat3"] . $sql_cond;
So, ist jetzt etwas ausführlicher geworden, hab mich gerade bissl beim schreiben verloren :D
lg
Doomdrake
Beitrag zuletzt geändert: 12.6.2011 10:41:05 von heroes-of-legends -
Danke für die vielen Vorschlägen ich habs so gelöst wie es darkpandemic gesagt hat.
-
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage