1 sayfadan 1. sayfa

sql konusunda kendine güvenenlere bir sorum war.

İletiTarih: 01.11.2007, 01:57
wdp
merhabalar .
üzerinde çalıştığım yeni projemde sql sorunu yaşıyorum.

konuyu açıklayacak olursak :
veri tabanında yorumlar ve isimler diye iki tablom var .


isimler tablosu şu şekilde :

+-----+-------+-------+------------+------------+-----------+----------+--------+----------+-------|
|--------------------------------------------|isimler|--------------------------------------------|
+-----+-------+-------+------------+------------+-----------+----------+--------+----------+-------|
| iid | isim |
+-----+-------+-------+------------+------------+-----------+----------+--------+----------+-------|
| 1 | mehmet |
| 3 | ali |





yorumlar tablosu şu şekilde :

+-----+-------+-------+------------+------------+-----------+----------+--------+----------+-------|
|--------------------------------------------|yorumlar|--------------------------------------------|
+-----+-------+-------+------------+------------+-----------+----------+--------+----------+-------|
|yid| iid | yorum |
+-----+-------+-------+------------+------------+-----------+----------+--------+----------+-------|
|56 | 1 | yorumlardan biri |
|57 | 3 | baska bir yorum |
|57 | 1 | dahada baska bir yorum |

yid=yorum id
iid= isim id
yorum = yorumlar





şimdi şöle bişey yapmak istiyorum :
en çok yorum yazılan 10 isimi alt alta dizmek :
yani şu şekilde:

mehmet (2)
ali (1)



en çok yorum alanı en üste almalı ve parantez içerisinde yorum sayısını yazmalı.


bu konuda bir çalışma yaptım her isime parantez içerisinde kaç tane yorum olduğunu yazıyorum ama bu isimleri parantez içerisindeki rakamın büyükten küçüğe doğru sıralayamıyorum.

yani sıralama yorum sayısına göre olmuyor isime göre oluyor :


kullandığım kodlar aşağıdaki gibi...

<? $sql6= "SELECT * FROM isimler ORDER BY fadi ASC";
$Calistirlistele6 = mysql_query ($sql6); while(list($v_fid1,$v_fadi1,$v_adres1,$v_ftelefon1,$v_kateid1,$v_yetkili1,$v_ykadi1,$v_ysifre1)=mysql_fetch_array($Calistirlistele6))
{ ?>
&nbsp;<lii>&nbsp;<a style='text-decoration: none' href="isimincele.php?iid=<? print $v_fid1; ?>"><? print $v_fadi1; ?>(<? $sql3= "SELECT COUNT(*) FROM yorumlar WHERE fid='$v_fid1' and durum='Onayli' ";
$Calistirlistele3 = mysql_query ($sql3);
while(list($veri3)=mysql_fetch_array($Calistirlistele3))
print $veri3;?>)</a></lii><br>
<? } ?>



bu kodları nasıl düzenlersek istediğim gibi yaparız sıralamayı ? yorum sayısına göre sıralamalı.



yardımlarınız için tşkkr ederim.

Re: sql konusunda kendine güvenenlere bir sorum war.

İletiTarih: 01.11.2007, 06:18
ALEXIS
Kodlara baktıkça, ucundan da olsa php bildiğimden şüphe ediyorum.

En baştan izlediğiniz yol oldukça kötü. Başarılı bir framework, veya en olmazsa kendi oluşturduğunuz bir framework ile çalışın.

Framefork içinde yer alacak en temel gereksinimleriniz:

* sql sınıfı
* cache sınıfı
* tema sınıfı


Yukarıdaki işlemi standart php ile yapacağım, ancak sizin örneğinizi düzenleyemeğicim.

Re: sql konusunda kendine güvenenlere bir sorum war.

İletiTarih: 01.11.2007, 08:26
ALEXIS
Kullanım mantığı bana, komutlar php.net'e aittir. Dosya GPL lisanslıdır, istediğiniz gibi kullanabilirsiniz, sadece nereden geldiğini unutmayın. Kod olarak eklenen dosyaların sıkıştırılmış arşiv hali yazının en sonundadır.


Aşağıdaki örnekte, yukarıda verdiğim framework bileşenleri ile ilgili hiçbir sınıf kullanılmadı, direk sayfa içinde mysql bağlantısı yapıldı, ve tüm işlemler mysql komutları ile yapıldı. Acemilerin zorlanmamı için hata fonksiyonlarını da ekledim.

Dosya içinde yeterince açıklama yaptığımı sanıyorum, anlamadığınız yerleri sorabilir (bana güvenmeyin, uzun zaman sonra yanıt verebilirim) veya php.net adresine bakabilirsiniz.


Dosyalar:

database.sql

Kod: Tümünü seç
-- phpMyAdmin SQL Dump
-- version 2.10.3
-- http://www.phpmyadmin.net
--
-- Anamakine: localhost
-- Üretim Zamanı: 01 Kasım 2007 saat 08:08:49
-- Sunucu sürümü: 5.0.45
-- PHP Sürümü: 5.2.3

SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";

--
-- Veritabanı: `test_wdp`
--

-- --------------------------------------------------------

--
-- Tablo yapısı: `wdp_isimler`
--

CREATE TABLE `wdp_isimler` (
  `iid` mediumint(8) unsigned NOT NULL auto_increment,
  `isim` varchar(255) collate latin1_general_ci NOT NULL,
  PRIMARY KEY  (`iid`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci AUTO_INCREMENT=4 ;

--
-- Tablo döküm verisi `wdp_isimler`
--

INSERT INTO `wdp_isimler` (`iid`, `isim`) VALUES
(1, 'ahmet'),
(2, 'mehmet'),
(3, 'veli');

-- --------------------------------------------------------

--
-- Tablo yapısı: `wdp_yorumlar`
--

CREATE TABLE `wdp_yorumlar` (
  `yid` mediumint(8) unsigned NOT NULL auto_increment,
  `iid` mediumint(8) unsigned NOT NULL,
  `yorum` text collate latin1_general_ci,
  PRIMARY KEY  (`yid`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci AUTO_INCREMENT=5 ;

--
-- Tablo döküm verisi `wdp_yorumlar`
--

INSERT INTO `wdp_yorumlar` (`yid`, `iid`, `yorum`) VALUES
(1, 1, 'ahmet - yorum 1'),
(2, 1, 'ahmet - yorum 2'),
(3, 1, 'ahmet - yorum 3'),
(4, 2, 'mehmet - yorum 1');

sirala.php

Kod: Tümünü seç
<?php
/**
*
* @version $Id: sirala.php
* @copyright (c) 2007 Canver Software
* @license http://opensource.org/licenses/gpl-license.php GNU Public License
*
*/

// mysql erişim ayarları
$sunucu     = 'localhost';
$veritabani = 'test_wdp';
$kullanici     = 'root';
$parola     = '';
$tablo_onek    = 'wdp_';

// mysql tablo adları
define('KULLANICI_TABLE',     $tablo_onek . 'isimler');
define('YORUM_TABLE',         $tablo_onek . 'yorumlar');


// mysql bağlantısı aç
$baglan = mysql_connect($sunucu, $kullanici, $parola);

// bağalantı sağlanamaz ise hata ver
if (!$baglan)
{
    die (
'MySQL ile veri bağlantısı kurulamıyor!');
}

// veritabanı seç
mysql_select_db($onek . $veritabani, $baglan) or die('Veritabanı açılamıyor!' . mysql_error());

// [+] kullanıcıları listeleme sorgusu
$sql = 'SELECT * FROM ' . KULLANICI_TABLE . ' ORDER BY isim ASC';
$sorgu = mysql_query($sql);

if (!
$sorgu)
{
    die(
mysql_error());
}

while (
$row = mysql_fetch_assoc($sorgu))
{
    echo
$row['isim'] . ' (' . yorum_sayisi($row['iid']) . ')<br />';
}
mysql_free_result($sorgu);
// [-] kullanıcıları listeleme sorgusu

/**
* yorum_sayisi
*
* verilen kullanıcı id'e göre yorum sayısını geri döndürür
*/
function yorum_sayisi($iid)
{
    
// [+] yorum sayısı bulma sorgusu
    
$sql = 'SELECT COUNT(distinct yid) AS yorum_sayisi FROM ' . YORUM_TABLE . " WHERE iid = $iid";
    
$sorgu = mysql_query($sql);
    
    
// sonuç alınamaz ise mysql hatası ver
    
if (!$sorgu)
    {
        die(
mysql_error());
    }
    
    
$row = mysql_fetch_assoc($sorgu);
    
    
mysql_free_result($sorgu);
    
// [+] yorum sayısı bulma sorgusu    

    
return $row['yorum_sayisi'];
}

// bağlantıyı kapat
mysql_close($baglan);

?>


Önizleme resmi:

Resim