2016-04-04 5 views
1

Ich habe zwei Tabellen: items und items_meta. In einer Abfrage möchte ich alle Elemente aus der Items-Tabelle auswählen, die bestimmten Bedingungen entsprechen.Abrufen von Unterspalten (ID) aus einer SELECT QUERY für die Verwendung in einer anderen Abfrage

SELECT id,name,price description FROM items 
WHERE {some conditions are true}; 

Ich möchte auch alle Zeilen in der items_meta auszuwählen, die die id der Elemente in der ersten Abfrage entsprechen. Dies wird für einen anderen Zweck verwendet, der nicht direkt mit der ersten Abfrage zusammenhängt.

SELECT meta_name, meta_value,COUNT(*) FROM items_meta 
WHERE item_id IN ({the ids from the previous query}) 
GROUP BY meta_name, meta_value; 

Meine aktuelle Implementierung ist durch die ersten Ergebnisse in einer Schleife mit PHP und eine Liste der id erstellen in der zweiten Abfrage verwendet werden.

foreach ($items as $item){ 
    $items_id[] = $item["id"]; 
} 

$IDs = implode(",", $items_id); 

Ich denke, es sollte eine SQL-Ansatz besser als das sein.

Antwort

2

Verwenden join oder in:

SELECT im.meta_name, im.meta_value, COUNT(*) 
FROM items i JOIN 
    items_meta im 
    ON im.item_id = i.id 
WHERE {some conditions are true} 
GROUP BY im.meta_name, im.meta_value; 
+0

Diese Lösung ist, was ich eigentlich zuerst dachte. Die einzige Herausforderung besteht darin, dass die erste Abfrage tatsächlich eine vereinfachte Form einer komplexen Abfrage ist, die mehrere Tabellen verbindet, um das Ergebnis zu erzeugen. Das Wiederholen dieser Joins in der zweiten Abfrage macht es tatsächlich komplexer und rechenintensiver. – elSama

+0

Ich dachte auch über die Erstellung einer temporären Tabelle mit der ersten Abfrage, dann verwenden Sie Ihren Ansatz. Der Grund, warum ich diese Idee ablehnte, war, dass sie zusätzliche Komplexität mit sich brachte. Ich musste die Daten in die temporäre Tabelle einfügen und dann alle Ergebnisse wieder als meine erste Ausgabe auswählen. Ich würde mich freuen, wenn es eine Möglichkeit gibt, die Daten einzufügen und sie auch zurückzugeben – elSama

1

Versuchen Sie dieses:

SELECT id, 
    name, 
    price, 
    description, 
    meta_name, 
    meta_value, 
    COUNT(*) 
FROM items 
INNER JOIN items_meta ON items_meta.item_id = items.id 
WHERE {SOME conditions ARE TRUE} 
GROUP BY meta_name, 
    meta_value; 
+0

Vielen Dank für die Antwort. Ihre Lösung funktioniert, aber nicht so, wie ich es möchte. Wie ich in meiner Frage gesagt habe, brauche ich eigentlich zwei verschiedene Ergebnisse für zwei verschiedene Zwecke; aber Ihre Lösung bietet nur einen. Die Ergebnisse werden als zwei verschiedene Variablen an die Vorlage übergeben – elSama

0

Angenommen, Sie haben ein Formular, und die ID Ihres Artikels abrufen Sie dies tun könnte:

<?php 

// $db being the PDO connection 

$stmt_items = $db->query("SELECT id,name,price description FROM items WHERE {some conditions are true};"); 
$stmt_items_meta = $db->prepare("SELECT meta_name, meta_value,COUNT(*) FROM items_meta WHERE item_id = ".$_POST['id']." GROUP BY meta_name, meta_value;"); 
$stmt_count_items_meta = $db->query("SELECT COUNT(*) FROM items_meta WHERE item_id = ".$_POST['id'].";"); 

while ($item = $stmt_items->fetch()) { 

    // do things with your first query 

    if ($stmt_count_items_meta->fetchColumn() > 0){ 
     $stmt_items_meta->execute(); 
     // do things with your second query 
    } 
} 

Wenn nicht:

<?php 

$stmt_items = $db->query("SELECT id,name,price description FROM items WHERE {some conditions are true};"); 


while ($item = $stmt_items->fetch()) { 
    $stmt_items_meta = $db->prepare("SELECT meta_name, meta_value,COUNT(*) FROM items_meta WHERE item_id = ".$item['id']." GROUP BY meta_name, meta_value;"); 
    $stmt_count_items_meta = $db->query("SELECT COUNT(*) FROM items_meta WHERE item_id = ".$item['id'].";"); 
    // do things with your first query 

    if ($stmt_count_items_meta->fetchColumn() > 0){ 
     $stmt_items_meta->execute(); 
     // do things with your second query 
    } 
} 

Hoffen das hilft :)

Verwandte Themen