2016-08-31 4 views
0

So haben wir eine Drupal-Website mit Knoten in 4 Vokabularen getaggt. In SQL-Begriffen sind dies allesamt einfache Verknüpfungen in einer Basistabelle. Vereinfacht ausgedrückt sieht es ungefähr so:Berechnen Sie Kategoriengruppen mit Ergebnissen

SELECT a.name AS location, b.name AS sector, c.name AS tag, d.name AS status 
FROM node n 
LEFT JOIN a ON a.id = n.id 
LEFT JOIN b ON b.id = n.id 
LEFT JOIN c ON c.id = n.id 
LEFT JOIN d ON d.id = n.id 
WHERE n.type = 'X' 
GROUP BY a.name, b.name, c.name, d.name 

Wir eintragen Seite, wo Sie von A, B, C und D filtern können; Jede hat eine Liste aller Werte und eine "Alle" -Option.

Was wir brauchen, ist eine Liste von verschiedenen Kombinationen von A, B, C und D , die Ergebnisse haben. Dies dient dazu, eine Sitemap zu erstellen und natürlich wollen wir Bots nicht zu leeren Ergebnisseiten führen.

Ich habe versucht mit WITH ROLLUP mit Teilerfolg. Dies gibt mir a/b/c/d, a/b/c/*, a/b/*/*, a/*/*/* und */*/*/*. Es tut jedoch nicht */*/*/d, */b/*/* oder */b/*/d (zusammen mit allen like-Kombinationen).

Haben Sie Vorschläge, ob dies mit SQL möglich ist? Ich wäre nicht gegen die Verwendung von Unterabfragen.

Unsere alternative Theorie besteht darin, alle Knoten zu durchlaufen und in PHP ein Array mit allen Kombinationen zu erstellen, unter denen der Knoten erscheint. Zum Beispiel: Wenn der Knoten 1 in a/b/c/d ist, dann würde unser Angebot hat die

[ 
    'a/b/c/d', 
    'a/b/c/*', 
    'a/b/*/d', 
    'a/*/c/*', 
    'a/*/c/d', 
    'a/*/*/*', 
    '*/*/*/d', 
    '*/b/c/d', 
    '*/b/c/*', 
    '*/b/*/d', 
    '*/*/c/*', 
    '*/*/c/d', 
    '*/*/*/*', 
    '*/*/*/d', 
    '*/*/*/*', 
] 

er hinzugefügt folgendes (ich denke, das ist alle Kombinationen).

Die einzigartige Gruppe von diesen, am Ende werden alle verfügbaren Pfade/Optionen ohne irgendwelche leeren. Ich denke.

Dies ist offensichtlich ein bisschen eine Brute-Force-Ansatz. Es fühlt sich an, als würde es funktionieren, aber es fühlt sich weniger elegant an als mit SQL.

+0

Ich sehe das nicht wirklich als ein Problem mit der Abfrage, ich denke, das Problem ist mit den Daten. Wenn Ihre Abfrage nicht "*/*/*/d" zurückgibt, dann haben Sie nicht die erforderlichen Datensätze mit der gleichen 'node.id' in der Tabelle. Sql wurde entwickelt, um zurückzugeben, was in der Datenbank ist, und nicht, dass es nicht in der Datenbank ist. – Shadow

+0

Nicht ganz, @Shadow - so funktioniert WITH ROLLUP ... Es fasst von rechts zusammen. Mein Artikel existiert in Kategorie d, also * (was alles ist) für alle anderen wird d enthalten. Sie haben Recht, dass dies ein SQL-Problem ist ... Aber ich bin mir nicht sicher, wie Sie die Abfrage hier umformulieren. SQL gibt alle richtigen Werte zurück. ZB für diesen Knoten bekomme ich eine Zeile für 'a/b/c/d' und ROLLUP gibt mir die 'a/b/c/*', 'a/b/*/*', 'a/*/*/* 'und' */*/*/* 'Zeilen. ROLLUP wird jedoch '*/*/*/d' nicht tun. – Nick

+0

Ich sehe nicht, warum Sie 'Rollup' benötigen würden, wenn Sie die richtigen Daten in Ihren Tabellen hätten. – Shadow

Antwort

0

EDIT: Das funktioniert nicht, ich bin ziemlich sicher, alles ist es nicht die Ergebnisse

Hmm ... das gerade ausprobiert und es sieht aus wie Sie alle möglichen Ergebnisse unter Verwendung von 2-Abfragen bekommen könnten, Gruppierung in jeder Richtung:

dh GROUP BY a.name, b.name, c.name, d.name

dann GROUP BY d.name, c.name, b.name, a.name

Aber dann habe ich versucht, beide Gruppierungsrichtungen in einer Abfrage hinzuzufügen und es sieht ziemlich vielversprechend aus:

dh GROUP BY a.name, b.name, c.name, d.name, c.name, b.name, a.name


Ich denke, das funktioniert, aber es könnte sein, besserer Weg.

Ich bin mit 4 Abfragen alle Ergebnisse zu erhalten, wie folgt aus:


SELECT a.name AS location, b.name AS sector, c.name AS tag, d.name AS status 
FROM node n 
LEFT JOIN a ON a.id = n.id 
LEFT JOIN b ON b.id = n.id 
LEFT JOIN c ON c.id = n.id 
LEFT JOIN d ON d.id = n.id 
WHERE n.type = 'X' 
GROUP BY a.name, b.name, c.name, d.name 

SELECT b.name AS sector, c.name AS tag, d.name AS status 
FROM node n 
LEFT JOIN b ON b.id = n.id 
LEFT JOIN c ON c.id = n.id 
LEFT JOIN d ON d.id = n.id 
WHERE n.type = 'X' 
GROUP BY b.name, c.name, d.name 

SELECT c.name AS tag, d.name AS status 
FROM node n 
LEFT JOIN c ON c.id = n.id 
LEFT JOIN d ON d.id = n.id 
WHERE n.type = 'X' 
GROUP BY c.name, d.name 

SELECT d.name AS status 
FROM node n 
LEFT JOIN d ON d.id = n.id 
WHERE n.type = 'X' 
GROUP BY d.name 

So gibt die erste Abfrage alle Ergebnisse zurück, bei denen alle 4 Kategorien einen Wert haben, dh a/b/c/d und der Rollup fügt sie für a/b/c/-, a/b/-/- hinzu. , a/-/-/- (die Bindestriche sind für Alle Filterwert, Sterne verschwinden, wenn ich sie aus irgendeinem Grund eintippe)

Dann gibt die zweite Abfrage alles für */b/c/d und das Roll-Up zurück fügt -/b/c/- -/b/-/-

der dritten Ertrag -/-/c/d und die Rolle nach oben ergänzt -/-/C/-

dann dem vierten fügt die -/-/-/d und -/-/-/-

Was ich denke ist alles

Verwandte Themen