Mysql One-To Many Relation Sorusu
-
selam beyler öncelikle tablo yapılarım aşağıdaki gibi : posts - categories ve post_category_relations diye üç tablom var, tahmin ediceğiniz gibi birinde postlar birinde kategoriler birinde post-kategori ilişkileri var.her bir postun birden fazla kategorisi olabilmesi için bu şekilde bir yapı tercih ettim
mysql> describe post_category_relations;
+-------------+---------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------------+---------+------+-----+---------+----------------+
| relation_id | int(11) | NO | PRI | NULL | auto_increment |
| post_id | int(11) | NO | | NULL | |
| category_id | int(11) | NO | | NULL | |
+-------------+---------+------+-----+---------+----------------+
3 rows in set (0.01 sec)mysql> describe posts;
+---------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+---------+--------------+------+-----+---------+----------------+
| post_id | int(11) | NO | PRI | NULL | auto_increment |
| title | varchar(255) | YES | | NULL | |
| content | text | YES | | NULL | |
| date | datetime | YES | | NULL | |
| active | tinyint(1) | YES | | NULL | |
+---------+--------------+------+-----+---------+----------------+
5 rows in set (0.00 sec)mysql> describe categories;
+----------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+----------+--------------+------+-----+---------+----------------+
| cat_id | int(11) | NO | PRI | NULL | auto_increment |
| cat_name | varchar(255) | YES | | NULL | |
+----------+--------------+------+-----+---------+----------------+
2 rows in set (0.00 sec)___
Kullandığım sorgu şu şekilde amacım sadece kategori id si 2 olan postları çekmek olsun mesela, having le yapabildim sadece where falan kullanınca hata verdi sürekli, having like %% kullanınca da kategori id si 2 olanla 21 olanı ayıramıyorum, nettede adam gibi örnek bulamadım yardımlarınızı bekliyorum:
SELECT posts . * , (
SELECT GROUP_CONCAT( DISTINCT categories.cat_name )
FROM categories
LEFT JOIN post_category_relations ON post_category_relations.category_id = categories.cat_id
WHERE post_category_relations.post_id = `posts`.post_id
GROUP BY post_category_relations.post_id
) AS category, (
SELECT GROUP_CONCAT( DISTINCT categories.cat_id )
FROM categories
LEFT JOIN post_category_relations ON post_category_relations.category_id = categories.cat_id
WHERE post_category_relations.post_id = `posts`.post_id
GROUP BY post_category_relations.post_id
) AS cate_id
FROM (`posts`
)
HAVING `cate_id` LIKE '%2%'
LIMIT 0 , 30 -
iç içe çok select kullanmışsın, performans sıfır :)
mssql için yazıyorum,
select p.*,c.* from post_category_relations PCR
INNER JOIN posts p in p.postsId = PCR.postsId
Inner JOIN category c in c.categoryId = PCR.categoryID
WHERE PCR.categoryID = 2
kolay gelsin
-
SharpShooter bunu yazdı
iç içe çok select kullanmışsın, performans sıfır :)
mssql için yazıyorum,
select p.*,c.* from post_category_relations PCR
INNER JOIN posts p in p.postsId = PCR.postsId
Inner JOIN category c in c.categoryId = PCR.categoryID
WHERE PCR.categoryID = 2
kolay gelsin
hocu mysql de çalışmadı bu , aynı mantıkla tekrar yazdım yine olmadı benmi yanlış yapıyorum :/ deli oldum amnk.wordpress e baktım şimdi adamlar 3-4 sorguda yapmış tek sorguda yapmak istiyorum ben
-
inner joindeki in'leri on'a çevirirsen mysql'de de çalışması gerekiyor.
Austen tarafından 26/Eki/12 10:17 tarihinde düzenlenmiştir -
Slothere bunu yazdıSharpShooter bunu yazdı
iç içe çok select kullanmışsın, performans sıfır :)
mssql için yazıyorum,
select p.*,c.* from post_category_relations PCR
INNER JOIN posts p in p.postsId = PCR.postsId
Inner JOIN category c in c.categoryId = PCR.categoryID
WHERE PCR.categoryID = 2
kolay gelsin
inner join'deki in leri on'a çevirirsen mysql'de de çalışması gerekiyor.
çevirdim hocam:
SELECT posts. * , categories. *
FROM post_category_relations
INNER JOIN posts ON posts.post_id = post_category_relations.post_id
INNER JOIN categories
IN categories.cat_id = post_category_relations.category_id
WHERE post_category_relations.category_id =2
LIMIT 0 , 30 -
INNER JOIN categories
IN categories.cat_id = post_category_relations.category_idburdakini unutmuşsun. column adlarında sıkıntı yoksa çalışması gerekiyor.
-
Slothere bunu yazdı
INNER JOIN categories
IN categories.cat_id = post_category_relations.category_idburdakini unutmuşsun. column adlarında sıkıntı yoksa çalışması gerekiyor.
@slothere @sharpshooter süpersiniz hocalar, ben olaya yanlış yaklaşıyomuşum sanırım.
-
Once Posts tablosunun icinde categori_id diye bir sutun olusturup, postlarin categori id lerini burada tut.
post_category_relations diye bir tabloya hic ihtiyacin yok.
Asagidaki sorgu isini gorur.
SELECT c.cat_name, p.title, p.content, p.date, p.active
FROM categories c
LEFT JOIN posts p
ON c.cat_id = p.categori_id
WHERE c.cat_id = '2'Edit: Sorgularinda sutun sayisi ne kadar olursa olsun * kullanman pek iyi degil.
sniperscope tarafından 26/Eki/12 10:34 tarihinde düzenlenmiştir -
sniperscope bunu yazdı
Once Posts tablosunun icinde categori_id diye bir sutun olusturup, postlarin categori id lerini burada tut.
post_category_relations diye bir tabloya hic ihtiyacin yok.
Asagidaki sorgu isini gorur.
SELECT c.cat_name, p.title, p.content, p.date, p.active
FROM categories c
LEFT JOIN posts p
ON c.cat_id = p.categori_id
WHERE c.cat_id = '2'Edit: Sorgularinda sutun sayisi ne kadar olursa olsun * kullanman pek iyi degil.
hocam bir post birden fazla kategorideyse ne yapıcaz ?
-
O nasil olacak anlamadim. Bir post sadece bir kategoriye ait olur, ve onun alt kategorisi olur.
Simdi, karsinda bir araba var, bu araba hem arac kategorisinde, hemi gemi, hemde ucak kateogirisinde.
sniperscope tarafından 26/Eki/12 11:15 tarihinde düzenlenmiştir -
sniperscope bunu yazdı
O nasil olacak anlamadim. Bir post sadece bir kategoriye ait olur, ve onun alt kategorisi olur.
Simdi, karsinda bir araba var, bu araba hem arac kategorisinde, hemi gemi, hemde ucak kateogirisinde.
php - mysql ile ilgili bi makale yazdığımı düşün hocam, bu makale hem php hemde mysql kategorisinde çıkmalı mesela.zaten bunu kullanıcağım yapı bambaşka, soru rahat anlaşılsın diye bu şekilde post-kategori olayıyla sordum
