почему псевдонимы приводят к сбою моего запроса в phpMyAdmin? - PullRequest
1 голос
/ 19 декабря 2011

Следующий запрос прекрасно работает в моем php-скрипте, но когда я запускаю его в phpMyAdmin (для той же базы данных), я не получаю никаких результатов (даже «0 результатов» - он просто обновляет страницу).

  SELECT comment, username, image, post_date, ((us.user_id != 22) AND

        ((SELECT read_date FROM
        bookmarks WHERE
        product_id=456029 AND
        user_id=22) < post_date)) AS
        new_comment FROM

        comments AS
        co, users AS
        us, flair WHERE co.product_id=456029 AND
        co.user_id=us.user_id AND
        flair_id=us.active_flair_id ORDER BY
        co.post_date ASC

Я заметил, что если вынуть псевдонимы, запрос работает в phpMyAdmin

SELECT comment, username, image, post_date, ((users.user_id != 22) AND

        ((SELECT read_date FROM
        bookmarks WHERE
        product_id=456029 AND
        user_id=22) < post_date)) AS
        new_comment FROM

        comments, users, flair WHERE comments.product_id=456029 AND
        comments.user_id=users.user_id AND
        flair_id=users.active_flair_id ORDER BY
        comments.post_date ASC

Мне любопытно, почему это произошло. (работает phpMyAdmin - 2.11.9.5)

РЕДАКТИРОВАТЬ: переформулировка Ричарда ниже работает в phpMyAdmin. Так что теперь загадка заключается в том, почему одна формулировка работает, а другая - нет (когда они обе работают нормально при выполнении в php-скрипте).

окончательная форма запроса после совета Ричарда об удалении подзапроса:

SELECT c.comment AS 
COMMENT , username, image, DATE_FORMAT( c.post_date,  '%b %D, %Y' ) AS post_date, IF( (
(
b.read_date IS NULL
)
OR (
b.read_date < c.post_date
) ) , IF( c.user_id !=1, 1, 0 ) , 0
) AS new_comment
FROM comments c
INNER JOIN users u ON c.user_id = u.user_id
INNER JOIN flair f ON flair_id = u.active_flair_id
LEFT JOIN bookmarks b ON ( b.product_id = c.product_id
AND b.user_id =1 ) 
WHERE c.product_id =538968
ORDER BY c.post_date ASC 

1 Ответ

1 голос
/ 19 декабря 2011

У вас очень странный запрос, я бы его тоже не принял ...

   SELECT comment, username, image, post_date
        , (
              (users.user_id != 22) 
          AND (
                  (
                       SELECT read_date 
                         FROM bookmarks 
                        WHERE product_id=456029 
                          AND user_id=22
                  ) 
              < post_date)
         ) AS new_comment 
    FROM comments, users, flair 
   WHERE comments.product_id=456029 
     AND comments.user_id=users.user_id 
     AND flair_id=users.active_flair_id 
ORDER BY comments.post_date ASC

немного переписать:

     SELECT comment, username, image, post_date
          , (
                (u.user_id != 22) # What is this for? First you check if it is not user 22
            AND (
                    (
                       SELECT read_date 
                           FROM bookmarks 
                         WHERE product_id=456029 
                            AND user_id=22  # And now you check if it is
                    ) 
                < post_date)
           ) AS new_comment 
      FROM comments c
INNER JOIN users u ON c.user_id = u.user_id 
INNER JOIN flair f ON flair_id = u.active_flair_id 
     WHERE c.product_id = 456029 
  ORDER BY c.post_date ASC

Какова ваша цель с этим запросом?Конечно, это можно написать лучше ...

Как насчет этого:

    SELECT c.comment, username, image, c.post_date
         , IF(b.read_date < c.post_date, 1, 0) AS new_comment 
      FROM comments c
INNER JOIN users u ON c.user_id = u.user_id 
INNER JOIN flair f ON flair_id = u.active_flair_id 
 LEFT JOIN bookmarks b ON (b.product_id = c.product_id AND b.user_id = u.user_id)
     WHERE c.product_id = 456029 
  ORDER BY c.post_date ASC

В вашем запросе нет причин использовать подзапрос.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...