kostenloser Webspace werbefrei: lima-city


SELECT auf Spalte alle Zeilen mit gl. 2. Spalte ausgeben

lima-cityForumProgrammiersprachenPHP, MySQL & .htaccess

  1. Autor dieses Themas

    t**k

    Hey,

    Titel ist leider etwas zusammengefasst und ungenau, aber hatte leider nicht genug Platz, diesen auszuschreiben.

    Gegeben habe ich eine Tabelle mit folgendem Aufbau:

    int_chatid | int_userid
             1 | 5
             1 | 6
             2 | 5
             2 | 7
             3 | 6
             3 | 7


    Ich suche im Moment nach einer Möglichkeit durch ein einziges SELECT mit der Bedingung int_userid = [irgendeine ID] alle Zeilen zu bekommen, die die betreffende int_chatid enthalten, aber nicht die eigentliche Zeile, also (mit int_userid = 5):

    int_chatid | int_userid
             1 | 6
             2 | 7


    oder für int_userid = 6:

    int_chatid | int_userid
             1 | 5
             3 | 7


    Da komme ich nur leider nicht weiter, da ich keine Idee habe, wie man das machen könnte, oder ob das überhaupt geht...

    Hat jemand von euch da eine Idee zu?
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

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

  3. Hallo

    ich glaube es ist einfacher, die Abfrage inklusive der Zeile mit der User-ID zu machen
    und erst danach diese "eigentliche Zeile" wieder raus zu filtern.

    $uid = 5; 
    $query1 = "SELECT int_chatid FROM tabelle WHERE int_userid=$uid"; 
    $result1 = mysql_query($query1); 
    
    $where = ''; 
    
       while($row=mysql_fetch_assoc($result1)) {
           $where .= "int_chatid=$row['int_chatid'] AND "; 
       }
    
    // --- das letzte AND entfernen 
    $where = substr($where, 0, strrpos($where, 'AND')); 
    
    /// bei $uid=5 dann so: $where = "int_chatid=1 AND int_chatid=2"; 
    
    $query2 = "SELECT * FROM tabelle WHERE $where"; 
    
    $result2 = mysql_query($query2); 
    
    $data = array(); 
    
       while($row=mysql_fetch_assoc($result)) {
           if ( $uid != $row['int_userid'] ) { 
                  $data[] = $row; 
           }
       }
    
    print "<pre>\n"; 
    print_r($data); 
    print "</pre>\n";



    ... siehe zweite while() Schleife ... die if-Bedingung

  4. Autor dieses Themas

    t**k

    Danke erstmal für deinen Vorschlag.

    Die Idee mit dem aneinanderreihen der Bedingungen war mir auch schon gekommen, jedoch ist das für mich eher ein unschönes Gefrickel, kann mir auch nicht vorstellen, dass das auf Dauer effizient ist. (Zudem müsste es OR und nicht AND sein).

    Am liebsten hätte ich eine Tabellenstruktur die wie folgt aussieht:

    int_chatid | list_userids
      [chatid] | [userid1, userid2]


    Also dass ich pro chatid nur eine Zeile habe und alle userids in dieser Zeile stehen dann und ich nach einer bestimmten userid suchen muss, damit ich nur eine Abfrage brauche.

    Da dies in MySQL (meines Wissens nach) nicht möglich ist, suche ich nach einer Möglichkeit, mit nur einer Abfrage alle Zeilen mit gleichen chatids bei einer Suche nach einer bestimmten userid zurückzugeben.

    Ich habe selber meine Zweifel, dass man das mit MySQL (oder sonst einer relationalen Datenbank) das hinbekommen kann, aber bin da auch nicht allwissend, also frage ich hier.
    Wenn es nicht mit MySQL gehen sollte, wüsste da jemand vielleicht, was ich mir da für ein Datenbanksystem ansehen muss?
  5. hackyourlife

    Moderator Kostenloser Webspace von hackyourlife

    hackyourlife hat kostenlosen Webspace.

    Irgendwie ist deine Anforderung immer noch nicht ganz verständlich … was genau willst du erreichen? Welchem Zweck soll das dienen? Vielleicht lässt das erahnen, was genau du meinst.

    Meinst du eventuell sowas? (ungetestet)
    SELECT * FROM tabelle A
    	JOIN tabelle B ON A.int_chatid = B.int_chatid
    	WHERE B.int_userid = ?
  6. wenn das alle in einer Tabelle steht,
    dann ist das mit dem OR (nicht AND, hast recht) schon das "richtige"

    ...
    
    $where = '';
     
       while($row=mysql_fetch_assoc($result1)) {
           $where .= "int_chatid=$row['int_chatid'] OR ";
       }
     
    // --- das letzte OR entfernen
    $where = substr($where, 0, strrpos($where, 'OR'));
    
    $query2 = "SELECT * FROM tabelle WHERE $where";
    
    ...


    das JOIN macht nur Sinn, wenn Daten in zwei verschiedenen Tabellen sind.


  7. Autor dieses Themas

    t**k

    hackyourlife schrieb:
    Meinst du eventuell sowas? (ungetestet)
    SELECT * FROM tabelle A
    	JOIN tabelle B ON A.int_chatid = B.int_chatid
    	WHERE B.int_userid = ?

    Ja, genau soetwas meinte ich, danke!

    Zum Hintergrund: Im Moment arbeite ich an einem Chat. Diese Tabelle soll für jeden Chat eine einzigartige ID und die Mitglieder (zwei oder mehr) enthalten. (Deswegen wäre mir die Zuordung int_chatid -> list_userids, wo ich dann nach einer einzelnen userid suchen kann, auch am liebsten, aber kann MySQL nicht, also sowas hier...). Ich möchte, dass der mir dann die einzelnen userids direkt mitlädt, damit ich sofort auch die Namen der User mitschicken kann an die Anwendung. Den Umweg über die chatid mache ich, damit ich eine einfach zu indizierende Spalte in der Nachrichten Tabelle habe.

    Hoffe es ist etwas klarer geworden, was das bezwecken soll...

    mywebchat schrieb:
    das JOIN macht nur Sinn, wenn Daten in zwei verschiedenen Tabellen sind.

    Mit dem JOIN hab ich aber direkt das Ergebnis, was ich möchte und mit richtigen Indizes sollte der auch keine Probleme dabei machen.

    Achja, brauchst nicht immer Code anhängen, PHP bin ich eigentlich ganz fit, aber das ganze Projekt ist eh in JavaScript ;)
  8. Idee:

    speicher doch gleich zu jeder Chat-ID die Liste der User-IDs
    (array umwandeln zu JSON-String oder Komma-Getrennt, ...)

    so dass jede int_chatid nur 1x vorkommt und in der 2ten Spalte dann die "Liste" ..

    also gleich so, wie Du es haben willst

    int_chatid | list_userids
             1 | {5,6}
             2 | {5,7}
             3 | {6,7}


    also zu jeder chatid gleich in MySQL die ganze Liste speichern, nicht einzeln
    und beim Auslesen dann mit json_decode wieder zurück in array / object ...

    Beitrag zuletzt geändert: 11.11.2013 22:07:20 von mywebchat
  9. Autor dieses Themas

    t**k

    mywebchat schrieb:
    Idee:

    speicher doch gleich zu jeder Chat-ID die Liste der User-IDs
    (array umwandeln zu JSON-String oder Komma-Getrennt, ...)


    Geht nicht, weil ich dann nicht sauber darauf ein WHERE machen kann, nur mit Platzhaltern. Zudem müsste ich als Typ dann TEXT nehmen und das würde dafür sorgen, dass der bei jedem WHERE auf die Spalte mir eine temp Tabelle auf der Festplatte erzeugt -> langsam. Auch könnte eine Abfrage dafür keine Indizes nutzen, dies ist aber wegen der Erwarteten Menge der Daten in der Tabelle zwingend erforderlich, dass die Spalte mit den userids gut indiziert ist, einfach weil es sonst langsam wird.

    Aber werde mich jetzt erstmal mit dem Ansatz von hackyourlife beschäftigen und dann mal gucken, ob ich nicht ein Datenbanksystem finde, was kann was ich brauche.

    Danke für Eure Vorschläge!
  10. 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!