Bir alan boş olabilir zaman kullanarak üç tablo ile katılmak

3 Cevap php

Aşağıdaki kod harika çalışıyor. Bu iki MySQL tablodan verileri birleştirir. I comment adında üçüncü bir MySQL tablodan bazı verileri çekerek değiştirmek istiyorum.

Aşağıdaki HTML tabloda, title MySQL tablosunda bir alandır submission. Her title karşılık gelen bir submissionid alanı vardır. Bu alan, submissionid da comment MySQL tabloda bulunmaktadır.

Aşağıdaki HTML tablosunun içinde, countComments adlandırılan bir alan commentid herhangi bir {[için comment MySQL tablosunda görünen sayısını eşit istiyorum ( 3)]}, burada submissionid hem submission ve comment tablolarda aynıdır ve submissionid karşılık gelir title kullanılmaktadır.

İşte yakalamak bulunuyor: Hiçbir satır MySQL tablosunda varsa comment o submissionid table, I [(3) {istiyorum için kullanılan karşılık }] sıfıra eşit.

Bunu nasıl yapabilirim?

$sqlStr = "SELECT s.loginid, s.title, s.url, s.displayurl, l.username
             FROM submission AS s,
                  login AS l
            WHERE s.loginid = l.loginid
         ORDER BY s.datesubmitted DESC
            LIMIT 10";


$result = mysql_query($sqlStr);

$arr = array(); 
echo "<table class=\"samplesrec\">";
while ($row = mysql_fetch_array($result)) { 
    echo '<tr>';
    echo '<td class="sitename1"><a href="http://www.'.$row["url"].'">'.$row["title"].'</a></td>';
    echo '</tr>';
    echo '<tr>';
    echo '<td class="sitename2"><a href="http://www...com/sandbox/members/index.php?profile='.$row["username"].'">'.$row["username"].'</a><a href="http://www...com/sandbox/comments/index.php?submission='.$row["title"].'">'.$row["countComments"].'</a></td>';
    echo '</tr>';
    }
echo "</table>";

3 Cevap

Sen bir INNER JOIN yapıyorsun, ama özellikle, bir LEFT JOIN, JOIN OUTER gerekir. LEFT JOIN ile, "sol" tablo her zaman katılmış, ve hiçbir yazışma varsa sağdaki tablonun alanları sıfır olarak ayarlanır. Fark, bu wikipedia page çok iyi açıklanmıştır.

Sonra gruba aynı teslim kimliği ile satır var ve bir gönderme bir yorum varsa ne kadar satırlar ... bir gönderme, bir yorum ve diğeri sadece varsa ikisi 1 gruplandırılmış satır var hiçbirine sahip olduğunu bakımı, gruplandırılmış saymak , bir sonraki sorguda c.submissionid null, öyle olacak

SQL olabilir

SELECT s.loginid, s.title, s.url, s.displayurl, l.username, c.submissionid, 
IF(c.submissionid IS NULL, 0, COUNT(*))  AS countComments
FROM submission AS s
INNER JOIN login AS l ON l.loginid = s.loginid
LEFT JOIN comments AS c ON c.submissionid = s.id
GROUP BY (s.id)
ORDER BY s.datesubmitted DESC
LIMIT 10

Hatalar olabilir, ben sorguyu test değil ... Ama sana doğru fikir verdik umuyoruz, bu dış katılır ve iç birleşimler arasındaki farktır.

Ben doğru sorunu anlamak, nasıl hakkında:

SELECT s.loginid, s.title, s.url, s.displayurl, l.username, COUNT(c.id) AS commentCount
FROM submission AS s
LEFT JOIN login AS l ON l.loginid = s.loginid
LEFT JOIN comments AS c ON c.submissionid = s.id
ORDER BY s.datesubmitted DESC
LIMIT 10

denemek

SELECT s.loginid, s.title, s.url, s.displayurl, l.username, c.submissionid, 
       COUNT(c.submissionid) AS countComments
FROM submission AS s
INNER JOIN login AS l ON l.loginid = s.loginid
LEFT JOIN comments AS c ON c.submissionid = s.id
GROUP BY s.loginid, s.title, s.url, s.displayurl, l.username, c.submissionid
ORDER BY s.datesubmitted DESC
LIMIT 10

veya

SELECT s.loginid, s.title, s.url, s.displayurl, l.username, c.submissionid, 
       (SELECT count(*) FROM submission s WHERE c.submissionid =s.submissionid) AS countComments
FROM submission AS s
INNER JOIN login AS l ON l.loginid = s.loginid
ORDER BY s.datesubmitted DESC
LIMIT 10

I (m) herhangi bir yazım hatası vermedi :) sağlanması

If it wveyaks fveya you I can provide mveyae explanations.