PHP + MySQL, nasıl koşulları ile birçok tablolar katılırım

3 Cevap php

Ben web boyunca kullanıcıların tam aktivite almak için çalışıyorum.

Ben bir kullanıcı o koşulu ile, veritabanı boyunca birçok tablo katılın gerekir.

Ne şu anda yazdım olduğunu:

SELECT * FROM 
comments AS c 
JOIN rphotos AS r 
ON c.userID = r.userID
AND c.userID = '$defineUserID';

Ama ne o dönüyor kullanıcı hakkında her şey, ama o satırları tekrarlar.

For instance, for one user he has 6 photos and 5 comments So I expect the join to return 11 rows.

Bunun yerine şöyle 30 sonuçları verir:

PhotoID = 1;
CommentID = 1;
PhotoID = 1;
CommentID = 2;
PhotoID = 1;
CommentID = 3;

ve böylece ...

Ben yanlış ne yapıyorum?

What I'm trying to achieve (example)

Eğer bir facebook kullanıcı iseniz, her profil kronolojik sırayla web sitesinde kullanıcının etkinliğini bildiren bir 'duvar' vardır. Ben benzer bir şey yapmaya çalışıyorum.

3 Cevap

Ben yanlış ne yapıyorum?

iki basit olanları kullanmak olabilir zaman tek Karmaşık bir sorgu kullanıyor.

Aşağıdaki gibi yapmanız gerekir:

SELECT * FROM  user AS u
LEFT JOIN rphotos AS r ON u.userId = r.userID
LEFT JOIN comments AS c ON u.userId = c.userID
WHERE u.userId = '$defineUserID'

Updated to fix silly mistakes

Bu ne yapar sonra gerekirse diğer tablolardaki katılmak ve satır tekrarı olmamalıdır kullanıcı tablo (bu durumda 1) ilgili tüm kullanıcıları seçmektir.

Sorgu da mantıklı düşünmek daha mantıklı.

Belirli bir kullanıcı 6 fotoğraf var ve sadece kullanıcı kimliğine dayalı tüm fotoğraf ve yorumların kartezyen ürünü getiriliyor konum beri 5 comments, oldukça normal ise 30 sonuçları almak. Tablo yapısı olası çözümler üzerine bir ışık tutabileceğini, ancak yorumlar fotoğrafları ile ilgili ve eğer belirli bir kullanıcı gibi bir şey kullanabilirsiniz yayınlanan tüm fotoğraf ve yorumlarınızı almak istiyorum:

SELECT * FROM rphotos p
LEFT JOIN comments c on c.photoID = p.photoID
WHERE p.userID = '$defineUserID' OR c.userID = '$defineUserID';

Şahsen ben 2 sorguları içine bu bölünmüş olacak ve onları karıştırma yani, bana hiç mantıklı değil, çünkü ayrı ayrı sonuçlarını görüntüler. kullanmak

SELECT * FROM rphotos p
WHERE p.userID = '$defineUserID';

ve

SELECT * FROM comments c
WHERE c.userID = '$defineUserID';

edit based on comment

Kimlik alanları aynı tipte iseniz gibi bir şey kullanabilirsiniz

select actionID, relatedID, creationDate from
(
select 1 as actionID, photoID as relatedID, creationDate from rphotos
where userID = '$defineUserID'
union
select 2 as actionID, commentID as relatedID, creationDate from comments
where userID = '$defineUserID'
) actions
order by creationDate desc;

The actionID will be 1 for a photo, 2 for a comment ve using the relatedID field you could lookup the linked data (if you need it, otherwise you could just drop it from the query).

BTW Muhtemelen göstermez birlik satırların çok katılmadan önlemek için (yani tarihe göre) daha sonuçları filtrelemek istiyorum ...