Hellen: Alle Ergebnisse aus JOIN holen

Hey.

Ich habe einen Online-SHop und möchte eine Suche erstellen.
Ich nutze PostgreSQL 8.4.

Ich habe eine Tabelle mit Produkten:
produktid name
0 ipad
1 iphone
2 ipod touch
3 blackberry

und eine Tabelle mit Angeboten
id angebotname produktid
0 ipad4free   1
1 iphone4free 2
2 blackberryNOT4free 3

Wenn ich in die Suche "ip" eingebe, möchte ich alle angebote haben bei denen ein Produkt mit "ip" angeboten wird anhand der produktid.

Das habe ich bisher so probiert:

SELECT Angebote.produktid, name,id, angebotname FROM Produkte
INNER JOIN Angebote ON Angebote.produktid=Produkte.Produktid
WHERE Produkte.name ILIKE '%".$searchterm."%'

Leider bekomme ich dann nur _ein_ Ergebnis. =/
Ich will aber Angebot 0 und 1  bekommen und ggf. halt noch mehr, falls noch mehr da sind.

Lg, Hellen

  1. Moin!

    CREATE TABLE IF NOT EXISTS `produkte` (  
      `id` int(11) NOT NULL auto_increment,  
      `name` text NOT NULL,  
      PRIMARY KEY  (`id`)  
    ) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=5;
    
    INSERT INTO `produkte` (`id`, `name`) VALUES  
    (0, 'ipad'),  
    (1, 'iphone'),  
    (2, 'ipod touch'),  
    (3, 'blackberry');
    
    CREATE TABLE IF NOT EXISTS `angebote` (  
      `id` int(11) NOT NULL auto_increment,  
      `angebotname` text NOT NULL,  
      `produktid` int(11) NOT NULL,  
      PRIMARY KEY  (`id`)  
    ) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=4 ;
    
      
    INSERT INTO `angebote` (`id`, `angebotname`, `produktid`) VALUES  
    (0, 'ipad4free', 1),  
    (1, 'iphone4free', 2),  
    (2, 'blackberryNOT4free', 3);
    
    SELECT  
      `produkte`.`id`           AS `p_id`,  
      `produkte`.`name`         AS `p_name`,  
      `angebote`.`id`           AS `a_id`,  
      `angebote`.`produktid`    AS `a_p_id`,  
      `angebote`.`angebotname`  AS `a_name`  
    FROM  
      `produkte`,  
      `angebote`  
    WHERE  
      `produkte`.`name` LIKE '%IP%'  
    AND  
      `angebote`.`produktid`=`produkte`.`id`;
    

    Sowas?

    MFFG (Mit freundlich- friedfertigem Grinsen)

    fastix

    1. Hallo fastix,

      Dein Code wird unter PostgreSQL nur Syntaxfehler werfen ...

      SELECT

      produkte.id           AS p_id,
        produkte.name         AS p_name,
        angebote.id           AS a_id,
        angebote.produktid    AS a_p_id,
        angebote.angebotname  AS a_name
      FROM
        produkte,
        angebote
      WHERE
        produkte.name LIKE '%IP%'
      AND
        angebote.produktid=produkte.id;

        
      ... und implizite Joins sind nicht besser als explizite Joins, ganz im Gegenteil.  
        
        
      Freundliche Grüße  
        
      Vinzenz
      
  2. Hallo,

    Ich habe einen Online-SHop und möchte eine Suche erstellen.
    Ich nutze PostgreSQL 8.4.

    schon einmal an die Volltextsuche von PostgreSQL gedacht?

    produktid name
    0 ipad
    1 iphone
    2 ipod touch
    3 blackberry

    und eine Tabelle mit Angeboten
    id angebotname produktid
    0 ipad4free   1
    1 iphone4free 2
    2 blackberryNOT4free 3

    Wenn ich in die Suche "ip" eingebe, möchte ich alle angebote haben bei denen ein Produkt mit "ip" angeboten wird anhand der produktid.

    SELECT Angebote.produktid, name,id, angebotname FROM Produkte
    INNER JOIN Angebote ON Angebote.produktid=Produkte.Produktid
    WHERE Produkte.name ILIKE '%".$searchterm."%'

    Leider bekomme ich dann nur _ein_ Ergebnis. =/

    Deine Query, um $programmiersprache bereinigt und mit Aliasnamen versehen:

    SELECT  
        p.produktid,  
        p.name,  
        a.id,  
        a.angebotname  
    FROM  
        Produkte p  
    INNER JOIN  
        Angebote a  
    ON  
        a.produktid = p.produktid  
    WHERE  
        p.name ILIKE '%ip%';  
    
    

    Ich will aber Angebot 0 und 1  bekommen und ggf. halt noch mehr, falls noch mehr da sind.

    liefert mir erwartungsgemäß das von Dir gewünschte Ergebnis. Es muss also etwas anderes falsch sein. Prüfe also im Postgres-Client Deiner Wahl die Query und lass Dir mal vor dem Ausführen die von Dir erzeugte Query ausgeben.

    Bevor ich's vergesse: wenn Du Benutzereingaben (wie Suchbegriffe) in dynamisch zusammengesetzem SQL verwendest, solltest Du den Kontextwechsel beachten. Dies gilt auch für PostgreSQL.

    Freundliche Grüße

    Vinzenz

    1. War ein PHP Fehler bei mir..

      Sagmal bringen die Alias was? Die machen bei so kleinen Queries das ganze doch nur langsamer oder?

      Lg, Hellen

      1. Hallo,

        Sagmal bringen die Alias was?

        sie machen Abfragen lesbarer. Es gibt Fälle, in denen Aliasnamen zwingend erforderlich sind.

        Die machen bei so kleinen Queries das ganze doch nur langsamer oder?

        Nein.

        Freundliche Grüße

        Vinzenz