2016-03-21 3 views
2

Im Folgenden finden Sie meine AnfrageUnion alternieren, um die Abfrage effizienter zu gestalten. Mysql

Select 
count(t.prid) 
from 
(select 
    pr.prid 
from 
    jcp 
inner join pr ON pr.prid = jcp.prid 
where 
    jcp.custid = 123 union select 
    pr.prid 
from 
    jcl 
inner join pr ON pr.prid = jcl.prid 
where 
    jcl.custid = 123) as t 

ist es eine Möglichkeit, es effizienter zu machen? Diese Abfrage befindet sich in einer bestimmten Funktion und führt tausende von Malen aus. also langsam machen.

+0

Gibt es eine Tabelle, in der custid ein Primärschlüssel ist? – Derenir

+0

Es wäre nützlich, wenn Sie uns Ihre Tabellen beschreiben (wie in [sqllfiddle] (http://sqlfiddle.com/)) und Ihr Ziel! , dann könnten wir sogar eine einfachere Abfrage finden. – Arash

+0

Könnte es einfacher sein, einfach nur die Zahlen von jcp und jcl zu erhalten und sie dann in php zusammenzufassen (oder in welcher Sprache auch immer)? Zwei sehr schnelle Abfragen sind möglicherweise besser als eine mit schlechter Verbindung. – AntonChanning

Antwort

0

Zunächst scheint Ihre Abfrage zwei sehr unterschiedliche Arten von Daten in Ihrer "Union" zu kombinieren - der erste Teil ist die Zählung einer ID und der zweite ist die Literal-ID - also würde ich mich fragen, ob dies der Fall ist tut wirklich das, was Sie vorhaben, wie geschrieben. Allerdings nur, es für bare Münze nehmen, könnten Sie die Unterabfrage im ersten Teil eliminieren, wie folgt:

SELECT COUNT(pr.prid) 
FROM jcp 
    INNER JOIN pr 
    ON pr.prid = jcp.prid 
WHERE jcp.custid = 123 

Ich kann nicht sagen, wie viel die Ihre Leistung ohne zu wissen, den Kontext Ihrer Daten helfen würde, aber es würde sicherlich nicht weh tun.

Angesichts der Unterschiede in den beiden Datensätzen scheint es nicht möglich, die Vereinigung zu vermeiden, wenn Sie diese zwei verschiedenen Datenbits in dieselbe Spalte zwingen wollen. Wenn Sie sie in verschiedene Spalten setzen würden, könnten Sie wahrscheinlich die Vereinigung vermeiden.