2016-04-04 16 views
1

İki tablom var: items ve items_meta. Bir sorguda, bazı tablolarla eşleşen öğeler tablosundan tüm öğeleri seçmek istiyorum.Başka bir sorguda kullanılmak üzere SELECT QUERY alt sütunlarını (id) alın

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

Ben de ilk sorguda öğelerin id maç items_meta tüm satırları seçmek istiyorum. Bu, doğrudan ilk sorguyla ilgili olmayan başka bir amaç için kullanılacaktır.

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; 

Benim şu anki uygulama PHP kullanarak ilk sonuçlar arasında döngü ve ikinci sorguda kullanılacak id bir liste oluşturmak.

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

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

Bundan daha iyi bir sql yaklaşımı olması gerektiğini düşünüyorum.

cevap

2

kullanın join veya 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

Bu çözüm aslında ilk başta düşünce budur. Tek sorun, ilk sorgu aslında sonuç üretmek için birkaç tablo JOINS olan karmaşık bir sorgu basitleştirilmiş bir formudur. Bu birleşimleri ikinci sorguda tekrarlamak, onu daha karmaşık ve işlemci yoğunlaştırır. – elSama

+0

Ayrıca, ilk sorguyu kullanarak geçici bir tablo oluşturmayı düşündüm, sonra da yaklaşımınızı kullanın. Bu fikri reddettiğim nedeni, fazladan karmaşıklık getirmesiydi. Verileri geçici tabloya eklemek zorunda kaldım, sonra tüm sonuçlarımı ilk çıkışım olarak tekrar seçtim. Verileri yerleştirmenin ve geri göndermenin bir yolu varsa memnun olurum. – elSama

1

deneyin bu bir:

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

Yanıt için teşekkür ederim. Çözümün işe yarıyor ama istediğim gibi değil. Sorumu söylediğim gibi, aslında iki farklı amaç için iki farklı sonuca ihtiyacım var; ama çözümünüz sadece bir tane sağlar. Sonuçlar, şablona iki farklı değişken olarak iletilecektir. – elSama

0

bir form var ve bu yapabileceğini öğenin kimliği almak varsayarsak:

<?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 
    } 
} 

Değilse:

<?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 
    } 
} 

Umut bu yardımcı olur :)

İlgili konular