MySQL farklı tablolardan aynı kişiye ait farklı bilgileri çekmek

Başlatan karakayahakan, 16 Ağustos 2012 - 10:28:27

« önceki - sonraki »

0 Üyeler ve 1 Ziyaretçi konuyu incelemekte.

karakayahakan

Herkese merhaba, hayırlı ramazanlar..

Öncelikle benim yapmak istediğim şöyle bir proje var.

birimimizdeki personelin bazı görevlendirmeleri oluyor. bu görevler

  • ücretli görev
  • ücretsiz görev
  • dış görev
şeklinde olsun.  veritabanımda bu işlemi gerçekleştirecek (görevlendirmeyi yapacak birim) için personel ve gorev isimli iki tablom var. amaç görev sayısını tutatarak projede 3 bay personel öner dediğimde sicili küçükten-büyüğe en az göreve gitmiş personeli çıktı vermesi gerekiyor. buna göre görevlendirme yapacak olan birim haksızlık yapmadan  ücretli - ücretsiz-dış görevlendirme yapabilecek.

Personel tablosu
id | ad | soyad | sicil | cinsiyet | aciklama

gorev tablosu
id | gorev_ad | gorev_tarih | gorev_turu | gorevli_personel |  sayac

sicil bu iki tablodada aynı personele ait olacağına göre çalışmasını istediğim sorgu ilk tablodan o cinsiyete ait istenen personeli önerirken (bay-3 personel gibi) gorev tablosundan da aynı sicildeki önerilmiş personelin gorev sayacını ekrana yazdırmalı.

Biliyorum biraz karışık gibi gelsede aslında mantığı basit ama sql sorgusunu yazamadım.
Yardımcı olursanız sevinirim. :-\

andirinli

tablolarını şu şekilde yap:


Personel tablosu
tcno | ad | soyad | sicil | cinsiyet | aciklama

gorev tablosu
id | tcno | gorev_ad | gorev_tarih | gorev_turu | sayac

sql komutu olarak :

select  gorev.*,personel.* from gorev inner join personel on personel.tcno=gorev.tcno

böylelikle personel ve görev tablolarını birbirine bağlamış olursun.

yazdıklarından anladığım kadarı ile iki tabloyu sql ile birleştirip kayıtları ona göre getirmek istiyorsun.
Kasa : RAIDMAX AEOLUS-ATX-WB
PowerSupply :CODEGEN SX500
Anakart : GIGABYTE  GA-970A-DS3
İşlemci :AMD Desktop FX-Series X8120 3.1
Bellek : 4 x 4 GB CORSAIR 1600Mhz, DDR3 CL9 Vegeance
Ekran Kartı : MSI R7 370 GAMING 2G AMD Radeon R7 370 2GB GDDR5 256 Bit
HDD : 4 x Sandisk SSD Plus 480GB
Monitör : 2 x DELL S2240T Dokunmatik

karakayahakan

Cevabınız için teşekkür ederim.

Evet.. iki tablo üzerinden veri çekmek istiyorum. Peki join yaptıktan sonra sql döngüm bana 
veritabanımdan ;

$sorgu = mysql_query("select  gorev.*,personel.* from gorev inner join personel on personel.sicil=gorev.sicil'");
$bilgi = mysql_fetch_array($sorgu);

echo $bilgi['gorev_turu'];



sorgusuyla sicili aynı olan personel bilgisi verecek. ve tabloya döküm alabileceğim..

Benim yapmak istediğim sicili küçük olan (sayıyla büyük) personeli görev sayısına göre en azdan en çoğa sıralatmak. İki değişkene bağlı olarak bir tablo oluşturmam gerekecek yani.. sıkıntı sanırım burada doğuyor. bu anlamda bir kafa karışıklığım var..


sem

İstediğiniz çıktı için örnek 3 satır gösterebilirseniz sorguyu hazırlamanızda yardımcı olalım... Açıkcası tam olarak kafamda canlanmadı istenen çıktı...


Mesaj tekrarı yüzünden mesajınız birleştirildi. Bu mesajın gönderim tarihi : 17 Ağustos 2012 - 15:57:12

Böyle bir çıktının var olması gerekmiyor zaten var olsa bunları konuşmazdık herhalde herhangi bir uygulama ile istediğinizi alabilseniz =) O nedenle istediğim, sadece el ile oluşturdğunuz 3 - 5 satırlık bir çıktı.
".NET çemberinden geçen lirisist etkisi bir 'Volcano', bir yüzüm Java bir yüzüm Badalamenti Don Tano"
----------------------------------------------------------------------------------------------------------------------
"Her yer ölüm yine, burası dünya
Derken ölüm bile bu nasıl dünya?
Benden ölüm dile, batıyor gün yine
Burası dünya?

karakayahakan

Aslında tam olarak anlatamadım. Kusura bakmayın vakitlerinizi alıyorum.

Proje : Görev Sayacı
Amaç : Kurumumda görevlendirme usulü (ücretli-ücretsiz-dış görev) ile çalışılıyor. Kim kaç kere ücretli kim kaç kere ücretsiz göreve gitmiş şeklinde kayıtylar tutacak ve bu kayıtlar doğrultusunda yeni görev yazılırken "bana ücretli/ücretsiz/dış görev için 5 erkek personel öner" dediğimde veritabanında cinsiyeti erkek olan verileri sicil ve daha önce gittiği görev türlerini baz alarak en az göreve gitmiş en sicilli erkek personeli ekrana çıktı verecek.

Çıktı ile birlikte verilen 5 erkek personelden check edilen misal 3  personel için yeni görev yazılmış olacak.


Böylece o yazılan 3 personelin görev sayıları da yazıldıkları görev türüne göre 1 artmış olacak.
Bilmiyorum buraya kadar herşey anlaşılır oldu mu?

Ben görev bilgileri ve personel bilgilerini ayrı tablolarda tutmaya çalışıyorum. Nihayetinde o görev için farklı farklı personel bilgisinin tutulması gerekecek diye düşündüğüm için.

kafamdaki çıktı şu şekilde olacak:


--sira--sicil-- birim-- gittiği görev sayısı -- detay -- ekle --
   1      15     Lojs.                2                   var     [ ]
   2      13     Bilg.                1                   yok    [ ]


vb..


andirinli

sql cümlenin sonuna
where personel.cinsiyet='erkek' order by gorev_sayisi

ekle
Kasa : RAIDMAX AEOLUS-ATX-WB
PowerSupply :CODEGEN SX500
Anakart : GIGABYTE  GA-970A-DS3
İşlemci :AMD Desktop FX-Series X8120 3.1
Bellek : 4 x 4 GB CORSAIR 1600Mhz, DDR3 CL9 Vegeance
Ekran Kartı : MSI R7 370 GAMING 2G AMD Radeon R7 370 2GB GDDR5 256 Bit
HDD : 4 x Sandisk SSD Plus 480GB
Monitör : 2 x DELL S2240T Dokunmatik

sem

Anlık olarak yazdırmanıza gerek yok aslında, aşağı doğru uzayan bir talblo olduğunu düşünerek bir şeyler karaladım... Yalnız hem bu saatte, hem bu yorgunlukta ve dar vakitte yaptım. En önemlisi ise veri olmadan test ettim =)=)=) Ama yapmak istediğimi anlayacaksınız sanıyorum, aksi hali de sorun değil, her an sorabilirsiniz... Bir orta yol bulunur=)

Dar vakitte salt mantığıını gösterebilmek için kullandığım sqlite scriptlerini paylaşıyorum, en aşağıdaki esas oğlanımız oluyor; dediğim gibi şartlardan dolayı iddiali bir select yapısı değil şimdilik =) yani hatalı çalışıyor olabilir... Tekrar bildirmiş olayım... İyi çalışmalar.


create table kisiler
(
     kisi_id integer primary key
,    isim text not null
,    sisim text not null
,    sicil  text not null
,    cinsiyet text not null
,    aciklama text
);



create table  gorevler
(
     gorev_id integer primary key
,    gorev_tanimi text not null
);

create table yapilan_gorevler
(
     rowstamp integer primary key
,    gorev_turu integer not null
,    gorevli_personel not null
,    gorev_baslangic date not null
,    gorev_bitis date
,    FOREIGN KEY(gorevli_personel) REFERENCES kisiler(kisi_id)
,    FOREIGN KEY(gorev_turu) REFERENCES gorevler(gorev_id)
);



select q1.GOREV_TURU
--,      q1.GOREVLI_PERSONEL   id numarası gerekli olmayabilir raporda gerekli olursa yorum işareti kaldırılır.
,      kisiler.isim
,      kisiler.sisim
,      kisiler.sicil
,      q1.TOTAL_COUNT
from
(
select gorev_turu GOREV_TURU
,      gorevli_personel GOREVLI_PERSONEL
,      count(gorevli_personel) TOTAL_COUNT
from yapilan_gorevler
        group by gorev_turu, gorevli_personel
) q1
inner join kisiler on kisiler.kisi_id = q1.gorevli_personel
where GOREV_TURU <> -99 --- şimdilik tümünü al, istendiği zaman göreve göre kısıtlama getirilecek
order by TOTAL_COUNT
limit 3 --- kaç kişi isteniyorsa o kadar ile sınırlandırılmalı; örneğin 5

".NET çemberinden geçen lirisist etkisi bir 'Volcano', bir yüzüm Java bir yüzüm Badalamenti Don Tano"
----------------------------------------------------------------------------------------------------------------------
"Her yer ölüm yine, burası dünya
Derken ölüm bile bu nasıl dünya?
Benden ölüm dile, batıyor gün yine
Burası dünya?

karakayahakan

Cevaplarınız için teşekkür ederim. PC ile ilgili problemlerden dolayı dönüş yapamadım sizlere. Kusura bakmayın. PCmin Windows tarafı çöktü. artık tamamen UBUNTU. ama proje dosyalarını yeniden yazmam gerekiyor. Teşekkür ederim.