MySQL query

Gajel

Banned
Registriert
Mai 2010
Beiträge
1.146
Hallo Leute,

ich stehe mal wieder auf dem schlauch was eine bestimmte abfrage über (erstmal) 3 tabellen betrifft.

Ich habe folgenden 3 tabellen:

Tabelle oxarticles
[table="width: 500, class: outer_border"]
[tr]
[td]oxid[/td]
[td]oxtitle[/td]
[td]oxpic[/td]
[/tr]
[tr]
[td]1[/td]
[td]lenkrad[/td]
[td]lenkrad.jpg[/td]
[/tr]
[tr]
[td]2[/td]
[td]reifen[/td]
[td]reifen.jpg[/td]
[/tr]
[tr]
[td]3[/td]
[td]sitz[/td]
[td]sitz.jpg[/td]
[/tr]
[/table]


Tabelle oxcategories
[table="width: 500, class: outer_border"]
[tr]
[td]oxid[/td]
[td]oxtitle[/td]
[td]oxpic[/td]
[/tr]
[tr]
[td]10[/td]
[td]VW Golf[/td]
[td]lenkrad.jpg[/td]
[/tr]
[tr]
[td]11[/td]
[td]VW Polo[/td]
[td]reifen.jpg[/td]
[/tr]
[tr]
[td]12[/td]
[td]VW Passat[/td]
[td]sitz.jpg[/td]
[/tr]
[/table]

Tabelle oxobject2category
[table="width: 500, class: outer_border"]
[tr]
[td]oxid[/td]
[td]oxobjectid[/td]
[td]oxcatind[/td]
[/tr]
[tr]
[td]10.1[/td]
[td]1[/td]
[td]10[/td]
[/tr]
[tr]
[td]10.2[/td]
[td]2[/td]
[td]10[/td]
[/tr]
[tr]
[td]10.3[/td]
[td]3[/td]
[td]10[/td]
[/tr]
[tr]
[td]11.1[/td]
[td]1[/td]
[td]11[/td]
[/tr]
[tr]
[td]11.2[/td]
[td]2[/td]
[td]11[/td]
[/tr]
[tr]
[td]11.3[/td]
[td]3[/td]
[td]11[/td]
[/tr]
[tr]
[td]12.1[/td]
[td]1[/td]
[td]12[/td]
[/tr]
[tr]
[td]12.2[/td]
[td]2[/td]
[td]12[/td]
[/tr]
[tr]
[td]12.3[/td]
[td]3[/td]
[td]12[/td]
[/tr]
[/table]


Jetzt ich möchte ich mir gerne alle artikel, aufgrund der eingabe einer OXID (eines artikels) in ein inputfeld ALLE artikel-(namen) (oxtitle) anzeigen lassen die ebenfalls in der kategorie sind, wo der artikel bzw. die oxid des artikel ist, die ich in das inputfeld eingetragen habe.

Also wenn ich in mein inputfeld jetzt "1" eintrage und auf submit drücke, sollte das ergebnis wie folgt aussehen:

Lenkrad
Reifen
Spiegel


Mein problem ist das ich mich da irgend wie überhaupt nicht reinfühlen kann was den aufbau des query's angeht.

Ich habs vorher geschafft, mir alle kategorien anzeigen zu lassen, die einem artikel zugeordnet sind (query folgt) und dachte ich kann darauf aufbauen aber leider kriege ich es von der logik des query's nicht hin.

Mein query für alle kategorien anzeigen die einem artikel zugeordet lautet:

Code:
$result = mysql_query("SELECT oxcategories.oxtitle FROM oxobject2category, oxcategories WHERE oxobject2category.oxobjectid like '$term' and oxobject2category.oxcatnid = oxcategories.oxid ORDER BY oxtitle ASC")
or die(mysql_error());;

Leider bringt mich dieser nicht weiter. Würde mich über hilfe sehr freuen, wie so eine abfrage aussehen könnte.

Grüße und danke im voraus.
 
Zuletzt bearbeitet:
Du gibst eine eine Artikelnummer ein und das soll zu dem Ergebnis führen das alle Artikel angezeigt werden die in der selben Kategorie sind wie der angegebene Artikel?

Verstehe ich das richtig?
 
Versuch's hiermit:

Code:
SELECT DISTINCT oxtitle FROM oxarticles a
INNER JOIN oxobject2category b ON a.oxid = b.oxobjectid
WHERE b.oxcatind IN (SELECT oxcatind FROM oxobject2category WHERE oxobjectid = 1);
 
Subselect -> Zuerst Kategorie des Artikels finden dann alle Artikel ausgeben lassen die die ermittelte Kategorie beinhalten :)
 
NullPointer schrieb:
Versuch's hiermit:

Damit ende ich bei einer weißen seite :( Da muss ja was an der syntax oder was grobes nicht stimmen wenn eine weiße seite kommt
Ergänzung ()

Raging-Raven schrieb:
Subselect -> Zuerst Kategorie des Artikels finden dann alle Artikel ausgeben lassen die die ermittelte Kategorie beinhalten :)

Wenn ich jetzt noch fit in mysql wäre dann würde ich das glatt umsetzen ;)
 
Zuletzt bearbeitet:
Du musst übrigens sehr vorsichtig sein mit Benutzereingaben, wenn du das einfach so einbaust wie du es im Eröffnungspost zeigst ist das ein offenes Tor für SQL injections. Wenn du nicht weißt wie sich das absichern lässt oder dich einlesen willst, ist es besser das einem erfahrenen Webentwickler zu überlassen sonst kannst du sehr böse Überraschungen erleben.

Ein gutes Tool um mit queries zu experimentieren und noch so einiges anderes ist übrigens MySQL Workbench.
 
Das ding wird lokal auf einem xampp server laufen und dient nur als kleines testprojekt ;)
 
Zuletzt bearbeitet:
Habe mal etwas rumexperimentiert, bei mir funktioniert NullPointer's query.

Die unnötige ID in oxobject2category habe ich mal weggelassen.

Code:
CREATE TABLE oxarticles (
    oxid INT,
    oxtitle VARCHAR(100),
    oxpic VARCHAR(100),
    PRIMARY KEY (oxid));

CREATE TABLE oxcategories (
    oxid INT,
    oxtitle VARCHAR(100),
    oxpic VARCHAR(100),
    PRIMARY KEY (oxid));

CREATE TABLE oxobject2category (
    oxobjectid INT,
    oxcatind INT,
    PRIMARY KEY (oxobjectid, oxcatind),
    FOREIGN KEY articles (oxobjectid) REFERENCES oxarticles (oxid),
    FOREIGN KEY categories (oxcatind) REFERENCES oxcategories (oxid));

INSERT INTO oxarticles (oxid, oxtitle, oxpic) VALUES
    (1, 'lenkrad', 'lenkrad.jpg'),
    (2, 'reifen', 'reifen.jpg'),
    (3, 'sitz', 'sitz.jpg'),
    (4, 'spiegel', 'spiegel.jpg');

INSERT INTO oxcategories (oxid, oxtitle, oxpic) VALUES
    (10, 'VW Golf', 'lenkrad.jpg'),
    (11, 'VW Polo', 'reifen.jpg'),
    (12, 'VW Passat', 'sitz.jpg');

INSERT INTO oxobject2category (oxobjectid, oxcatind) VALUES
    (1, 10),
    (2, 10),
    (3, 10),
    (1, 11),
    (2, 11),
    (3, 11),
    (1, 12),
    (2, 12),
    (3, 12),
    (4, 10);


-- NullPointers query
-- all articles in the same category as article with id 1 ('lenkrad')
SELECT DISTINCT oxtitle FROM oxarticles a
INNER JOIN oxobject2category b ON a.oxid = b.oxobjectid
WHERE b.oxcatind IN (SELECT oxcatind FROM oxobject2category WHERE oxobjectid = 1);

-- Output: 
-- lenkrad
-- reifen
-- sitz
-- spiegel


-- all articles in the categories 'spiegel' is in
SELECT DISTINCT c.oxtitle AS Kategorie, a.oxtitle AS Artikel
FROM oxarticles a
    JOIN oxobject2category m ON a.oxid = m.oxobjectid
    JOIN oxcategories c ON m.oxcatind = c.oxid
WHERE m.oxcatind IN (
    SELECT n.oxcatind
    FROM oxarticles b JOIN oxobject2category n ON b.oxid = n.oxobjectid
    WHERE b.oxtitle LIKE 'spiegel');

-- Output:
-- VW Golf    lenkrad
-- VW Golf    reifen
-- VW Golf    sitz
-- VW Golf    spiegel


-- all categories 'lenkrad' is in
SELECT c.oxid, c.oxtitle
    FROM oxarticles b
        JOIN oxobject2category n ON b.oxid = n.oxobjectid
        JOIN oxcategories c ON n.oxcatind = c.oxid
    WHERE b.oxtitle LIKE 'lenkrad';

-- Output:
-- 10    VW Golf
-- 11    VW Polo
-- 12    VW Passat
 
Zuletzt bearbeitet: (added output)
Danke, ich probiere das mal aus und gebe dann eine rücklmeldung :)
 
Ich würde es so machen, wenn ich es richtig verstanden hab.
http://sqlfiddle.com/#!2/89b7d/4

Gajel schrieb:
Also wenn ich in mein inputfeld jetzt "1" eintrage und auf submit drücke, sollte das ergebnis wie folgt aussehen:

Lenkrad
Reifen
Spiegel

Ich hoffe, dass Spiegel ein Fehler ist und da Sitz hingehört, den was anderes geben die Daten gar nicht her ;)

Edit: Toll, jetzt hat Backslash fast die gleiche Lösung und ich war mal wieder zu lahm xD
Sein Join ist vermutlich sogar besser, aber ich hatte jetzt keine Lust noch zu googlen was mysql für Joins unterstützt.
 
Zuletzt bearbeitet:
Vielen Dank für die mühen leute!

Die querys von Freezedevil, NullPointer und Backslash funktionieren bestens. Jetzt habe ich die qual der wahl. Ein riesen dank. :)
Der nächste schritt wäre jetzt noch über eine vierte tabelle zu jedem artikel den ich als ausgabe bekomme ein attribut mit auszugeben.

Aber ich probiere erstmal wieder selber rum bevor ich direkt um hilfe bitte.

Daumen hoch für die hilfsbereitschaft!
 
Nimm die von Nullpointer. Er hat im Gegensatz zu mir einen expliziten Join verwendet weshalb die Anfrage höchstwahrscheinlich besser optimiert werden kann.
 
Zurück
Oben