私はここ数日、この複雑なMYSQL クエリを正確に機能させようと試みてきました。もちろん、非常に多くの側面があるため、100% 正しく機能していることを確実に知ることは困難です。より複雑な MYSQL クエリにはまったく適していません。また、私が今持っているこのクエリは非常に乱雑であるため、返されるデータは少し散在しており、この問題に対処する方法が正確にはわかりません. 私は MYSQL Join とすべてを読んで、ある程度理解しましたが、私の場合はどれを使用すればよいのか、それらを適切に使用する方法がわかりません。
正常に機能する現在のクエリを次に示します。(クリーンアップが必要だと思うので、冗長な値を持つ必要はありません)
$notificationsq = mysql_query("SELECT
N.*,
N.fromID,
N.date,
N.id AS ID, //I have to do this because if I don't it doesn't return anything,
///I guess because it joins 3 tables with the id column. not sure
///how to call the correct data.
MIN(N.state) AS State,
MAX(N.date) AS newDate,
P.*,
C.*,
P.id AS uniqueID
FROM notifications N
LEFT JOIN comments C ON N.action = 2 AND N.uniqueID = C.id AND C.state=0
LEFT JOIN posts P ON N.action = 1 AND P.id = N.uniqueID
OR N.action = 2 AND P.id = C.postID
WHERE N.userID = '$session'
AND (N.action = 1 AND N.state IN (0, 1) OR N.action = 2)
AND P.state = 0
GROUP BY P.id
ORDER BY
State ASC,
newDate DESC
") or die(mysql_error());
私のテーブル構造:
Table: notifications
id UserID FromID UniqueID Action State Read_Date Date
1 1 2 1 1 0 0 1325993600
2 1 6 2 1 0 0 1325993615
3 1 2 1 2 0 0 1325993622
4 1 6 2 2 0 0 1325993661
5 2 6 2 2 0 0 1325993661
Action = 1 は、UniqueID が投稿の列を識別することを意味します。Action = 2 は、UniqueID がコメントの列を識別することを意味します。
Table: posts
id ToID FromID Post State Date
1 1 2 Hey 0 1325993600
2 1 6 okay yeah 0 1325993615
Table: comments
ID PostID FromID Comment State Date
1 1 2 lol 0 1325993622
2 1 6 ohh 0 1325993661
したがって、action が 2 である Notifications テーブルでは、UniqueID は Comments テーブルの「id」用です。私が返したいのは PostID であるため、クエリでは UniqueID が代わりにこれであるかのようになります。
1
2
1
1
1