Bu MySQL WHILE döngüleri çalıştırmak için Tamam mı?

6 Cevap php

O başka bir tablodan sonuç almak için geçen her satırın kimliğini kullanarak bir döngü içindeyken bir mysql sorgu için Tamam mı? YA bunu yapmak için daha iyi bir yolu var mı?

$q = $__FROG_CONN__->query("SELECT cms_page.id, cms_page.title, cms_page.slug, cms_page_part.* FROM cms_page LEFT JOIN cms_page_part ON cms_page_part.page_id=cms_page.id WHERE cms_page.parent_id='8'");
$r = $q->fetchAll(PDO::FETCH_ASSOC);

echo '<ul id="project-list">';
  foreach ($r as $row) { 
    echo '<li>';
    echo '<a href="'.$row["slug"].'.html"><img src="<img src="phpThumb/phpThumb.php?src=public/images/'.$row[0].'/th.jpg&w=162" alt="" /></a>';
    echo '<div class="p-text">';
    echo '<h4>'.$row["location"].'<span>'.$row["project_date"].'</span></h4>';
    echo '<p>'.$row["body"].'</p>';
    echo '</div>';
    echo '</li>';
  }
echo '</ul>';

Ben sql sorgusu eşleşen başka bir tablodan project_date, vücut ve konumu alanlarını çekmeye çalışıyorum. Başlık ve sülük başka bir tabloda tutulur. Sadece sekiz ya da öylesine sonuçlar ama çok fazla oluyor im maksimum olmalıdır.

6 Cevap

IN kullanan önerileri gayet iyi, ama başka bir sorgudan kimlikleri alıyorsanız eğer, bu bir birleşim kullanan bir sorgu içine bu iki sorguları birleştirmek için daha iyi olabilir.

Yerine:

SELECT id FROM users WHERE age <30
SELECT id, x FROM userinfo WHERE userid IN ($id1, $id2, ..., $idn)

yapın:

SELECT users.id, userinfo.x
FROM users
LEFT JOIN userinfo ON userinfo.userid = users.id
WHERE age < 30

Bir sorgu preformıng yükünü azaltmak için, tek bir sorguda tüm verileri almak bakmak isteyebilirsiniz. Bu durumda siz) IN (bakmak isteyebilirsiniz, örneğin

SELECT * WHERE x IN (1, 2);

ARASINDAKİ () da vardır

SELECT * WHERE x BETWEEN 1 AND 2;

Daha fazla bilgi için mysql docs bakın

Ben sadece bir kez geçmek gerekiyor bir şekilde sorguyu oluşturmak için çalışacağını söyledi. ID = 1 VEYA ID = 2 OR ... Birden sorguları Geçme ve birden çok kayıt kümesi döndüren NEREDE gibi bir şey işleme ve ağ trafiği açısından pahalı.

Bu çok verimsiz olacak, ne istediğiniz kimliği tabloları katılmak için

SELECT * FROM table1 LEFT JOIN table2 ON (table1.ID = table2.ID) WHERE condition

Mysql join documentation

Bu size ihtiyacınız olan tüm bilgileri satır bir set dönecektir, iki tablodan döndü.

Küçük bir uygulama / küçük bir sonuç kümesinde, bu tamam olabilir, ama bu (küçük) bir sürü sonuçları veritabanına çağırır.

(Belki de görmek Yacoby's suggestion?) Veritabanına bir arama yapabileceğiniz alternatif bir yol bulursak, bu muhtemelen daha iyidir.

EDIT

Başka bir tablonun dışına doğru sonuçlar elde etmek için, bir tablodan kimlikleriyle sadece istiyorsanız, belki de bir sizin için ne arıyorsun katılmak?

SELECT t1.fieldA, t1.fieldB
FROM table1 t1
JOIN table2 t2 ON t1.ID = t2.ID
WHERE t2.someField = 'someValue'

O başka bir tablodan sonuç almak için geçen her satırın kimliğini kullanarak bir döngü içindeyken bir mysql sorgu için Tamam mı? YA bunu yapmak için daha iyi bir yolu var mı?

Sen SQL sorgunuzu yeniden formüle edilmelidir. Bir bellek tabloya id s koymak ve kullanmak demek, bir JOIN:

SELECT  *
FROM    idtable
JOIN    mytable
ON      mytable.id = idtable.id

Bu şekilde, MySQL sizin için döngüler yapacak ama (genellikle) daha verimli bir şekilde bunları yapacaktır.

SQL kümeleri ile çalışmak üzere tasarlanmış bir dildir.

Eğer id s bir dizi ve (dizilerini kümesidir) bir tablo var ise, ilk düşünce nasıl set-tabanlı işlemler {[(1 kullanarak bu setleri uygularım "olmalı )]} "?

Tabii ki bunun bir döngü içinde basit sorguların bir demet ama sadece (ve genellikle daha verimli bir şekilde bunu yapmış için büyük olasılıkla zaten yapmış SQL motor geliştiriciler ekstra işler yapmak bu şekilde çalıştırmak mümkün .)

Sen benim blog bu makaleyi okumak isteyebilirsiniz: