PHP & nüshalar Seçin

3 Cevap php

Ben ilk ve son adları kullanarak çoğaltır ve grup onları seçmek için bazı kod yazdı. Ben çok boyutlu bir diziye onları toplamak ve dedupe / çıkan sayfada jQuery / Ajax kullanarak bunları birleştirmek. Ben bunu yapıyorum nasıl daha dizi yaratmanın daha iyi bir yöntem olup olmadığını sormak istiyorum. İşte benim kodudur. Teşekkür ederim.

$dataArr=fetchDups($conn, 13, 5); // get a few at a time

print '<div style="clear:both;"></div><pre>';
print_r($dataArr);
print '</pre><div style="clear:both;"></div>'; 


    function fetchDups($conn, $client_id, $limit='')
    {

     $sql=' SELECT * FROM `contacts` WHERE `clientid`=\'13\' GROUP BY fname, lname ';
     //$sql=' SELECT DISTICT fname, lname, * FROM `clients` WWHERE `clientid`=\'13\' ';
     $res=mysql_query($sql, $conn)or die(mysql_error());
     $contactsRow=array();
     while($row=mysql_fetch_array($res)){
      echo $row['fname'].'<br>';
      $contactsRow[]=$row;
     }

  mysql_freeresult($res);

  $dataArr=array();
  $i=0;  
  $limitNum=0;
  //----------------------------------  

  foreach($contactsRow AS $rowNew){

   $sql=' SELECT * FROM `contacts` WHERE `clientid`=\'13\' AND `id`!=\''.$rowNew['id'].'\'  
    AND (`fname` = \''.$rowNew['fname'].'\' OR `lname` = \''.$rowNew['lname'].'\')
   ';
   //echo $sql;
   $res=mysql_query($sql, $conn)or die(mysql_error());
   $rowCountDup=mysql_num_rows($res);

   if($rowCountDup>0){

    $d=0;
    $dataArr[$i]=array();
    $dataArr[$i][$d]=$rowNew;
    while($rowNew=mysql_fetch_array($res)){
     $dataArr[$i][($d+1)]=$rowNew;
     $d++;    
    }

    $i++;
    $limitNum++;    

   }

   // limit the results. too many crashes the browser
   if($limitNum==$limit){
    break;
   }   

  }

  mysql_freeresult($res);

  return $dataArr;

    }

3 Cevap

Şeyler bu tür için, muhtemelen kullanarak denemelisiniz:

SELECT * FROM contacts refC JOIN contacts allC USING (fname, lname) WHERE refC.clientid='13'

Bu yaptığı ilk ve son adına göre kişileri kendinden katılmak, yani (kendisi dahil) refC 'nin ilk ve son adları paylaşan tüm kontakların listesine allC altyazı bulunmuyor.

Bu şekilde, size sadece tek bir SQL sorgusu içinde aradığınız tüm bilgi alabilirsiniz. Tuning sütun fname ve lname tablo üzerinde bir dizin contacts ekleyerek sorguyu elde edilebilir, bu nedenle katılmak bütün tablo ayrıştırmak zorunda değildir eşleşecek.

- Edit: Daha ince Eğer örneğin gibi tabloları birleştirmek nasıl belirtmek alabilirsiniz:

SELECT *
FROM contacts refC
JOIN contacts allC ON (allC.fname LIKE CONCAT(refC.fname, '%') AND allC.lname LIKE CONCAT(refC.lname, '%'))
WHERE refC.clientid='13'

Kesinlikle eşdeğer (ama daha okumak IMO kolay) olduğu için:

SELECT *
FROM contacts refC,contacts allC
WHERE allC.fname LIKE CONCAT(refC.fname, '%') 
AND allC.lname LIKE CONCAT(refC.lname, '%')
AND refC.clientid='13'

Sadece, çiftleri görüntüleme ve aslında db bunları kaldırarak değil önlemek DISTINCT SQL anahtar kelimeyi kullanmak istiyorsanız.

Ya da türetilmiş bir tablo kullanır burada ikinci sorgu gibi bir şey deneyebilirsiniz:

mysql> select * from contacts ;
+----+--------+---------+
| id | fname  | lname   |
+----+--------+---------+
| 1  | Annie  | Haddock |
| 2  | Annie  | Haddock |
| 3  | Ginger | Mole    |
| 4  | Ted    | Ted     |
| 5  | Ted    | Ted     |
+----+--------+---------+
5 rows in set (0.01 sec)

mysql> select id, fname, lname, total from 
			 (select *, count(*) as total 
			  from contacts group by fname, lname) people 
       where total > 1;
+-----------+--------------+--------------+--------------+
| people.id | people.fname | people.lname | people.total |
+-----------+--------------+--------------+--------------+
| 1         | Annie        | Haddock      | 2            |
| 4         | Ted          | Ted          | 2            |
+-----------+--------------+--------------+--------------+
2 rows in set (0.01 sec)

sonra sadece foreach ile yineleme. Yukarıdaki "insanlar" iç Seçerek oluşturulan türetilmiş bir tablo için bir takma ad olduğunu unutmayın