0

私はここ数日、この複雑な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
4

1 に答える 1

1

state = 0 フィルターがコメントへの接続を制限している場合、投稿の内部結合によって結果が除外される可能性があります。テストのために左結合も試してみてください。

ORDER BY 句 (ORDER BY P.State または N.State のいずれか) にプレフィックスを付ける必要があります。

N.id でエラーが発生する理由は、ID が既に N.* で選択されているためです。

複数の状態を処理するには、ENUM 型を使用することをお勧めします。これにより、同じパフォーマンスでより読みやすい SQL が得られます (つまり、2 ではなく N.action = 'add')。

select * は避けてください。エラーが発生しやすく、パフォーマンスは手動の方法ほど良くありません。

クリーンアップに関しては、クリーンな空白と名前を使用すると読みやすくなります。

SELECT notifications.*
     , notifications.fromID
     , notifications.date
     , MIN(notifications.state) AS State
     , MAX(notifications.date) AS newDate
     , posts.*
     , comments.*
     , posts.id AS uniqueID
FROM notifications
LEFT JOIN comments ON notifications.action = 2
                  AND notifications.uniqueID = C.id
                  AND comments.state = 0
LEFT JOIN posts ON (notifications.action = 1 AND posts.id = notifications.uniqueID)
                OR (notifications.action = 2 AND posts.id = comments.postID)
WHERE notifications.userID = '$session'
  AND (notifications.action = 1 AND notifications.state IN (0, 1) OR notifications.action = 2)
  AND posts.state = 0
GROUP BY posts.id
ORDER BY notifications.State ASC
       , newDate DESC
于 2012-01-10T00:28:34.403 に答える