MYSQL выбрать из дополнительных таблиц в базе данных, сопоставить данные и т. Д. - PullRequest
0 голосов
/ 08 января 2012

У меня есть этот запрос, который прекрасно работает, однако я хочу немного изменить свою таблицу базы данных, поэтому мне нужно немного изменить свой запрос. Мой рабочий запрос такой:

$notificationsq = mysql_query("
SELECT
    N.*,
    P.*,
MAX(N.date) AS newDate


 FROM
    notifications N,
    posts P

WHERE
    N.userID='$session'
AND
    (
            (
                   N.action='1'
                AND
                   (N.state = 0 OR N.state=1)
             )
            OR
                N.action='2'
     )
AND P.state='0'
AND
    N.uniqueID=P.id
GROUP BY
    N.uniqueID
ORDER BY
    N.state ASC,
    newDate DESC

") or die(mysql_error());

Теперь, что я делаю, это изменяю строку "uniqueID", так что мне нужно сделать следующее:

if(action==2){unqiqueID=C.postID} else {uniqueID=N.uniqueID}

Вот моя структура таблицы: i41.tinypic.com/nyzolg.png


Информация с фото:

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, уникальные идентификаторы предназначены для идентификатора в таблице комментариев. То, что я хочу вернуть, это PostID, поэтому в запросе все будет так, как если бы это был UniqueID:

1
2
1
1
1

Но UniqueID останется прежним, когда Action равен 1.

Ответы [ 2 ]

2 голосов
/ 08 января 2012

Нельзя ссылаться на вычисляемый столбец в предложении WHERE того же оператора SELECT.Обычно это можно обойти, используя подобъект, подобный следующему:

SELECT
  * /* or list the necessary columns specifically */ 
FROM (
  SELECT
    ...
    some_expression AS columnAlias,
    ...
  FROM ...
)
WHERE ...
  AND columnAlias = ...

Как вы можете видеть, столбец, вычисленный как some_expression, columnAlias, может быть доступен во внешнем SELECT с использованием его псевдонима.

Но вы тянете сюда довольно много столбцов и тоже используете маски, поэтому попытка использования подвыбора может привести к конфликту имен.Попытайтесь уменьшить количество столбцов, которые будут извлечены, указав их явно.


ОБНОВЛЕНИЕ

Основываясь на дальнейших объяснениях в комментариях, вот что я, вероятно, буду делать вваша ситуация:

SELECT
    P.id AS uniqueID2,
    MAX(N.Date) AS newDate,
    MIN(state) AS state,           /* or maybe 'AS minState', if you like */
    MAX(N.Read_Date) AS lastRead,  /* just another example to illustrate the
                                      point that most columns in this query
                                      should be selected with aggregating */
    ...  /* other columns as necessary */
FROM notifications N
    LEFT JOIN comments C ON N.action = 2 AND N.uniqueID = C.id
    INNER 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,    /* No 'N.' prefix here because now it is a reference
                     to the MIN(state) column, which has the same name.
                     If it looks too confusing, use a different alias for
                     the column and change this entry accordingly. */
    newDate DESC
0 голосов
/ 08 января 2012

Попытайтесь поместить uniqueID2 = P.id в блок HAVING вместо этого в блок WHERE. Я уверен, что это сработает.

Дэвид Лайонс, ehtu.com

...