Alle Ergebnisse aus JOIN holen
Hellen
- datenbank
0 fastix®0 Vinzenz Mai0 Hellen
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
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
Hallo fastix,
Dein Code wird unter PostgreSQL nur Syntaxfehler werfen ...
SELECT
produkte
.id
ASp_id
,
produkte
.name
ASp_name
,
angebote
.id
ASa_id
,
angebote
.produktid
ASa_p_id
,
angebote
.angebotname
ASa_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
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 blackberryund 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
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
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