2016-07-28 8 views
-1

würde geschätzt zu ändern Ich habe dies:SQL-Skript wird nicht wie vorgesehen arbeiten, einige Unterstützung, dass

SELECT * FROM `npt_articles` WHERE (date_discovered >= 1464534366 AND 
      date_discovered <= 1464534366 AND 
         npt_site_id = 4 AND 
         (@total_social := (comments_html + fb_total + google_plus_one + pinterest + linked_in) + 0.0) > 
         865.0 AND 
         http_status_code = 200) ORDER BY @total_social DESC; 

Es funktioniert, aber nicht annähernd so gedacht.

total_social ist der Aggregatwert anderer benannter Felder derselben Zeile (Datensatz, Objekt usw.), die dann mit einer Zahl verglichen werden, die in die Abfragezeichenfolge eingegeben wird. Ich möchte dieses Aggregat auch in einer virtuellen Spalte verwenden, um dann die Ergebnisse zu ordnen.

habe ich versucht, dies aber ich bin mir nicht sicher, ob dies der Weg zu gehen:

SELECT *, @total_social := (comments_html + fb_total + google_plus_one + pinterest + linked_in) + 0.0 FROM `npt_articles` 
WHERE (date_discovered >= 1464534366 AND 
         npt_site_id = 4 AND 
         @total_social > 
         865.0 AND 
         http_status_code = 200) ORDER BY @total_social DESC; 

Ich denke, was ich will so etwas wie diese:

SELECT *, ((comments_html + fb_total + google_plus_one + pinterest + linked_in) + 0.0) as total_social FROM `npt_articles` WHERE (date_discovered >= 1464534366 AND 
         npt_site_id = 4 AND 
         total_social > 
         865.0 AND 
         http_status_code = 200) ORDER BY total_social DESC; 

Das einzige Problem ist, dass MySQL Workbench sagt, dass total_social nicht existiert.

Ich habe versucht, einen CTE wie folgt aus:

WITH inner_table AS (
    SELECT 
     ((comments_html + fb_total + google_plus_one + pinterest + linked_in) + 0.0) AS total_social 
    FROM 
     `npt_articles` 
) 
select * FROM inner_table 
WHERE 
    (date_discovered >= 1464534366 
     AND npt_site_id = 4 
     AND total_social > 865.0 
     AND http_status_code = 200) 
ORDER BY total_social DESC; 

wie in „Referring to a Column Alias in a WHERE Clause“ aber MySQL Workbench wird es nicht akzeptieren, weil es nicht die WITH an dieser Position nicht mag, was ich jetzt weiß, wird von MySQL nicht unterstützt.

+1

Kein Zweifel, mit Beispieldaten und gewünschten Ergebnissen könnte jemand anderes herausfinden, was Sie eigentlich vorhaben. –

+1

Sie brauchen dafür KEINE Variable: 'select ... WHERE ((comments_html + ... + linked_in)> 865))' –

+0

wie würde ich dann an ORDER BY weiterleiten? plus Es existiert nicht außerhalb der Zeilenabfrage, weshalb ich es außerhalb der Abfrage mache. Ich denke, [virtuelle Spalten] (https://mariadb.com/kb/en/mariadb/virtual-computed-columns/) könnten das sein, wonach ich suche. – Thermatix

Antwort

0

rechts, so dass die Lösung die HAVING Klausel zu verwenden war, die ich von „How to use a temp column in the where clause“ gefunden, was ich denke, ist im Grunde eine WHERE Klausel, die nach einem SELECT passiert.

Jetzt sieht mein SQL wie folgt aus:

SELECT *, 
     (comments_html + fb_total + google_plus_one + pinterest + linked_in) + 0.0 AS total_social FROM `npt_articles` WHERE (
    date_discovered >= 1464534366 
    AND 
    npt_site_id = 4 
    AND 
    http_status_code = 200 
) 
HAVING total_social > 865.0 ORDER BY total_social DESC; 

Jetzt ist es die Abfrage der Fall ist, funktioniert die Auswahl, berechnet die total_social Spalte und führt dann eine zweite Abfrage total_social und anschließend Aufträge von total_social in absteigender Reihenfolge.

Verwandte Themen