die mit einigen der offensichtlichsten Dinge beginnen lassen und sehen, ob wir andere Informationen zu sammeln beginnen.
Nächste GROUP BY 1
auf Ihrer äußeren Abfrage muss GROUP BY partner_id
sein.
Weiter Sie keine order by
in Ihrer INNER
Abfrage benötigen und der Datenbank-Engine wird wahrscheinlich tun, um eine bessere Arbeitsleistung zu optimieren, ohne es so ORDER BY id
entfernen.
Wenn Sie möchten, dass Ihre endgültigen Ergebnisse bestellt werden, dann fügen Sie eine ORDER BY partner_id
oder ähnliche Klausel nach Ihrer Gruppe von Ihrer OUTER
Abfrage.
Es sieht aus wie es gibt auch Probleme mit, wie Sie eine partnerid
von partnerids
spalten, aber ich bin nicht positiv, weil ich Ihre Ansicht und die Daten, die es zu wissen, liefert müssen verstehen, wie das für partnerid
Ihre Rekordzählimpuls beeinflusst.
Weiter Ihre LEFT JOIN
Aussage über die util.seq_0_to_500
Ich bin ziemlich sicher, dass Sie die s.i = 1
als die erste Bedingung abfallen kann, wird davon überzeugen, dass auch weil 2
ist greater
als 1
. Ihr left join
verhält sich jedoch eher wie ein inner join
, weil Sie dann alle Nicht-Übereinstimmungen aus positron_articles
ausschließen, die kein s.i > 0
haben.
Seltsamer dann Ihre gesamte beitreten und inner
Abfrage verworfen Art bekommt, weil man nur Artikel wollen, die keine Kommas in ihren partnerids
haben: regexp_count (partner_ids,',') = 0
würde ich vorschlagen, den Code für Ihre util.seq_0_to_500
veröffentlichen und wenn Sie eine partner table
let benützen Sie das auch, da Sie Ihre Antwort wahrscheinlich viel einfacher mit dieser zusätzlichen Tabelle bekommen können, je nachdem wie regexp_count funktioniert. Ich vermute, regex_count(partnerids,partnerid)
Beispiel regex_count('12345,678',1234)
wird greater
als 0
zurückgeben, an diesem Punkt haben Sie keine andere Wahl, als die begrenzten Strings in eine andere Tabelle zu teilen, bevor Sie eine neue Matching-Funktion zählen oder erstellen.
Wenn regex_count nur genau zwischen Komma passt, und Sie haben eine Partnertabelle Ihre Frage, da dies so einfach sein könnte:
SELECT
p.partner_id
,COUNT(a.id) AS ArticlesAppearedIn
FROM
positron_articles a
LEFT JOIN PARTNERTABLE p
ON regexp_count(a.partnerids,p.partnerid) > 0
GROUP BY
p.partner_id
Ich werde mich tatsächlich korrigieren, wie ich einen Weg, dachte nur einen Partner Tisch beitreten ohne regexp_count
. Wenn Sie also eine Partner-Tabelle haben, könnte das für Sie funktionieren. Wenn nicht, müssen Sie die Strings teilen. Es prüft grundsätzlich, ob der partnerid
der gesamte partnerids
ist, am Anfang, in der Mitte oder am Ende von partnerids
. Wenn einer davon erfüllt ist, werden die Datensätze zurückgegeben.
SELECT
p.partner_id
,COUNT(a.id) AS ArticlesAppearedIn
FROM
PARTNERTABLE p
INNER JOIN positron_articles a
ON
(
CASE
WHEN a.partnerids = CAST(p.partnerid AS VARCHAR(100)) THEN 1
WHEN a.partnerids LIKE p.partnerid + ',%' THEN 1
WHEN a.partnerids LIKE '%,' + p.partnerid + ',%' THEN 1
WHEN a.partnerids LIKE '%,' + p.partnerid THEN 1
ELSE 0
END
) = 1
GROUP BY
p.partner_id
Sie sagen, 'partner_ids' ist eine durch Komma getrennte Liste von Werten? –
korrigieren Bozhidar, aber siehe meinen Kommentar unten, sieht aus wie das Problem war nicht mit dem oben genannten Skript, sondern vielmehr die App, die Daten zu Rotverschiebung exportiert. –