2017-02-07 8 views
1

Also habe ich einen Fehler in meiner Anwendung gefunden, es zeigte mir kein Ergebnis, das es haben sollte. Ich verfolgte es zurück zu der folgenden SQL-Abfrage (ich entfernte die irrelevanten Teile).Falsche MySQL Unterabfrage Ergebnis

Wie Sie die Abfrage von wc_hncat_products Zeilen sehen können, von denen wählen die entsprechende IDs hat eine Anzahl von> = 1 innerhalb der wc_hncat_product_category_has_product Tabelle

Wenn ich die Abfrage mit der Unterabfrage Ergebnis als eine Spalte ausführen, können Sie sehen, das Ergebnis ist 1. Aber wenn ich es in der WHERE-Klausel verwende, schlägt der >= 1 Vergleich fehl.

Der Nachweis, dass die Unterabfrage zurückgibt 1: Proof that the subquery DOES return 1

SELECT `wc_hncat_products`.`id`, 
    (SELECT Count(*) 
    FROM `wc_hncat_product_categories` 
      INNER JOIN `wc_hncat_product_category_has_product` 
        ON `wc_hncat_product_categories`.`id` = 
         `wc_hncat_product_category_has_product`.`category_id` 
    WHERE `wc_hncat_product_category_has_product`.`product_id` = 
      `wc_hncat_products`.`id` 
      AND `category_id` IN ('1')) count 
FROM `wc_hncat_products` 
WHERE `id` IN ('785') 

Diese Abfrage gibt eine Zeile, mit der Spalte count Wert 1 ist

Keine Ergebnisse mit Unterabfrage Zählwertvergleichsprozesses in WHERE-Klausel No results with subquery count comparison in WHERE clause

SELECT `wc_hncat_products`.`id` 
FROM `wc_hncat_products` 
WHERE (SELECT Count(*) 
     FROM `wc_hncat_product_categories` 
      INNER JOIN `wc_hncat_product_category_has_product` 
        ON `wc_hncat_product_categories`.`id` = 
             `wc_hncat_product_category_has_product`.`category_id` 
      WHERE `wc_hncat_product_category_has_product`.`product_id` = 
      `wc_hncat_products`.`id` 
      AND `category_id` IN ('1')) >= 1 
    AND `id` IN ('785') 

Diese Abfrage wählt 0 Zeilen aus. .

Wie ist das möglich? Sie können sehen, dass die Zählung tatsächlich 1 ist, aber der Vergleich schlägt immer noch fehl, da keine Ergebnisse zurückgegeben werden, während die Unterabfragen in beiden Szenarien identisch sind.

+1

ich nicht diese kleinen Bildtexte lesen kann. – jarlh

+1

Bearbeiten Sie Ihre Frage und die Abfragen in der Frage als * Text *. Sie haben genug Erfahrung auf der Website, dass Sie wissen sollten, dass dies eine gute Idee ist. –

+0

Ich aktualisierte die Frage, um die Codeblöcke einzuschließen. – Boyd

Antwort

0

Die Standardmethode zur Implementierung dieser Art von Prüfung ist die Verwendung von EXISTS.

So etwas sollte für Sie arbeiten:

SELECT `wc_hncat_products`.`id` 
FROM `wc_hncat_products` 
WHERE EXISTS (SELECT NULL 
     FROM `wc_hncat_product_categories` 
      INNER JOIN `wc_hncat_product_category_has_product` 
        ON `wc_hncat_product_categories`.`id` = 
             `wc_hncat_product_category_has_product`.`category_id` 
      WHERE `wc_hncat_product_category_has_product`.`product_id` = 
      `wc_hncat_products`.`id` 
      AND `category_id` IN ('1')) 
    AND `id` IN ('785') 
+0

Das gibt mir immer noch keine Ergebnisse, wenn ich es in die 'WHERE'-Klausel, es gibt mir jedoch ein Ergebnis, wenn ich die selbe Unterabfrage in der 'SELECT'-Klausel verwende, so wie' SELECT \ 'wc_hncat_products \'. \ 'id \ ', (SELECT \' category_id \ '...) als test' – Boyd

+0

Another Die Option besteht darin, dass Sie die Abfrage neu schreiben können, um die Unterabfrage vollständig zu entfernen. Stattdessen müssen Sie 'wc_hncat_products' an' wc_hncat_product_categories' und 'wc_hncat_product_category_has_product' anhängen, und Ihre' SELECT'-Klausel an 'SELECT DISTINCT', um doppelte Produkte zu vermeiden. –

+0

Vielen Dank für Ihren Vorschlag, aber ich suche nach einer Erklärung, warum die Abfragen nicht funktionieren. Ich verstehe wirklich nicht, warum sie nicht funktionieren. Vielleicht hat es etwas mit einigen mysql- oder engine-Einstellungen zu tun. – Boyd