kostenloser Webspace werbefrei: lima-city


Zelle mehrere Werte zuweisen Mysql

lima-cityForumProgrammiersprachenPHP, MySQL & .htaccess

  1. Autor dieses Themas

    onlysteul

    onlysteul hat kostenlosen Webspace.

    Hi
    Ich möchte gerne einer Zelle mehere Werte zuweisen also das zumbeisbiel der erste eintrag mit dem befehl
    SELECT * FROM `artikel` WHERE `kategorie` LIKE '6'
    sowohl auch beim Befehl
    SELECT * FROM `artikel` WHERE `kategorie` LIKE '7'
    ausgespukt wird. Wie ist das möglich?
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. thomasba

    Co-Admin Kostenloser Webspace von thomasba

    thomasba hat kostenlosen Webspace.

    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'
  4. Autor dieses Themas

    onlysteul

    onlysteul hat kostenlosen Webspace.

    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
  5. onlysteul schrieb:
    ... Ich möchte gerne einer Zelle mehere Werte zuweisen ...
    und das erinnert einen an enum.

    lg
  6. thomasba

    Co-Admin Kostenloser Webspace von thomasba

    thomasba hat kostenlosen Webspace.

    hemiolos schrieb:
    onlysteul schrieb:
    ... Ich möchte gerne einer Zelle mehere Werte zuweisen ...
    und das erinnert einen an enum.

    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.
  7. 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:
    _6; 7;
    ^^^----- Semikolon
    |'------ Zahl
    '------- Leerzeichen
    Das ermöglicht es dann den Datensatz über folgende Abfrage zu selektieren:
    SELECT * FROM `artikel`
    WHERE `kategorie` LIKE '% 6;%'
                             ^^^----- Semikolon
                             |'------ Zahl
                             '------- Leerzeichen
    Die Prozentzeichen sind Platzhalter (Wildcard-Character) für beliebig viele andere Zeichen.
    Das Leerzeichen und das Semikolon sind wichtig, damit man nicht mit Katgorien wie z.B. 66 oder 76 in konflikt kommt.
  8. Wie sieht es denn eigentlich aus mit
    SELECT * FROM `artikel` WHERE `kategorie` LIKE '6' OR `kategorie` LIKE '7'

    ???

    MfG CnP
  9. thomasba schrieb:
    Und wie soll das mit einem ENUM funktionieren?
    wie wär's mit refman lesen (link habe ich geliefert), bevor man weitere unnötige fragen stellt?
    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
  10. heroes-of-legends

    heroes-of-legends hat kostenlosen Webspace.

    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.
    Formel: 2^0 = 1   = 0000 0001
    Formel: 2^1 = 2   = 0000 0010
    Formel: 2^2 = 4   = 0000 0100
    Formel: 2^3 = 8   = 0000 1000
    Formel: 2^4 = 16 = 0001 0000
    ....

    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
  11. Autor dieses Themas

    onlysteul

    onlysteul hat kostenlosen Webspace.

    Danke für die vielen Vorschlägen ich habs so gelöst wie es darkpandemic gesagt hat.
  12. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!