2012-01-10 7 views
0

Я пытался получить этот комплекс MYSQL-запрос для работы точно в течение последних нескольких дней, конечно, потому что у него так много аспектов, что его очень сложно знайте, что он работает на 100%, и я не совсем хорош с более сложными запросами MYSQL. также этот запрос, который у меня сейчас, довольно грязный, поэтому возвращаемые данные немного разбросаны, и я не совсем уверен, как решить эту проблему. Я прочитал MYSQL Join и все, и я это понимаю, но я не уверен, что использовать в моем случае и как правильно их использовать.упрощение запроса MYSQL и исправление

Вот мой текущий запрос, который работает так, как должен. (Просто нуждается в очистке, я думаю, так что я не должен иметь избыточные значения)

$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 

Действие = 1 означает, что UniqueID идентифицирует столбец в сообщениях; Действие = 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 

Таким образом, в таблице Уведомления, где действие является 2, то UniqueID являются для «ид» в таблице комментариев. То, что я хочу, чтобы вернуть это сообщения дан, поэтому в запросе было бы просто, как если бы UniqueID был вместо этого:

1 
2 
1 
1 
1 

ответ

1

Если состояние = 0 фильтр ограничивает подключение к комментариям, то внутреннее соединение на сообщениях можно отфильтровать результат, попробуйте сделать это левым, а также проверить.

У вас должен быть префикс в вашем предложении ORDER BY (ORDER BY P.State или N.State).

Причина вы испытываете ошибку с N.id является то, что идентификатор уже выбран с N. *

Вы лучше использовать тип ENUM, чтобы иметь дело с несколькими государствами. Это приводит к тому, что более читаемый SQL с той же производительностью (т. Е. N.action = 'add' вместо 2)

Избегайте выбора *, его склонность к ошибкам и производительность не так хороша, как ручная альтернатива.

Насколько очистки, я считаю, что гораздо легче читать с чистой пробельных и имена:

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 
+0

Создание его LEFT JOIN не представляется никакой разницы, и добавление «C.state = 0 "все еще возвращает ошибку mysql –

+0

какая ошибка mysql? – amccausl

+0

О, извините, на самом деле я ошибочно поставил цитату, где она не принадлежала, но на самом деле она работает так, как должна. И я сейчас понимаю, что она действительно работала так, как предполагалось раньше, но я wasn обращая внимание на детали ... Так что эта проблема решена, однако мне все равно нужна помощь в очистке этого кода и, если это возможно, кажется довольно запутанным. –

Смежные вопросы