MySQL - получение отдельных строк в представлении - PullRequest
1 голос
/ 20 мая 2010

ОК, здесь идет. Я пытаюсь сделать вид, который показывает это:

+---------+---------+-------+--------+------------+---------------------+---------------+-------------------+-------------+
| post_id | status  | title | body   | ip_address | time_stamp          | category_name | sub_category_name | post_type   |
+---------+---------+-------+--------+------------+---------------------+---------------+-------------------+-------------+
|       1 | enabled | test  | test 2 |            | 2010-05-20 01:22:17 | For Sale      | Computers         | transaction |
+---------+---------+-------+--------+------------+---------------------+---------------+-------------------+-------------+
1 row in set (0.00 sec)

Запрос, который сделал это:

SELECT post.id AS post_id, 
post.status AS status, 
post_data.title AS title, 
post_data.body AS body, 
post_data.ip_address AS ip_address, 
post_data.time_stamp AS time_stamp, 
post_category.name AS category_name, 
post_sub_category.name AS sub_category_name, 
post_category.type AS post_type 
FROM post,
(
SELECT * FROM post_data WHERE post_data.post_id = post_id ORDER BY post_data.post_id DESC LIMIT 1
) AS post_data,
post_sub_category, 
post_category 
WHERE 
post.sub_category_id = post_sub_category.id AND 
post_sub_category.category_id = post_category.id

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

SELECT
post.id AS post_id, 
post.status AS status, 
post_data.title AS title, 
post_data.body AS body, 
post_data.ip_address AS ip_address, 
post_data.time_stamp AS time_stamp, 
post_category.name AS category_name, 
post_sub_category.name AS sub_category_name, 
post_category.type AS post_type 
FROM post,
post_data,
post_sub_category, 
post_category 
WHERE 
post.sub_category_id = post_sub_category.id AND 
post_sub_category.category_id = post_category.id
ORDER BY post_data.id DESC

Но это просто возвращает:

+---------+---------+-------+-----------+----------------+---------------------+---------------+-------------------+-------------+
| post_id | status  | title | body      | ip_address     | time_stamp          | category_name | sub_category_name | post_type   |
+---------+---------+-------+-----------+----------------+---------------------+---------------+-------------------+-------------+
|       1 | enabled | test  | test 2    |                | 2010-05-20 01:22:17 | For Sale      | Computers         | transaction |
|       1 | enabled | TEST  | TEST BODY | 192.168.10.155 | 2010-05-19 23:09:15 | For Sale      | Computers         | transaction |
+---------+---------+-------+-----------+----------------+---------------------+---------------+-------------------+-------------+
2 rows in set (0.00 sec)

Мне нужен только один ряд для post_id, и я хочу, чтобы он был самым новым. У кого-нибудь есть предложения? Я использую представления, чтобы попытаться упростить жизнь, когда речь идет о таких вещах, как мягкое удаление и все такое, а также, теоретически, сделать запрос на данные, которые мне нужны, в долгосрочной перспективе.

Большое спасибо заранее!

Ответы [ 2 ]

1 голос
/ 08 июня 2010

Вы можете использовать

 GROUP BY post_data.post_id HAVING MAX(post_data.time_stamp)

, чтобы получить только самый новый ряд. Таким образом, полный запрос может выглядеть так:

SELECT
post.id AS post_id, 
post.status AS status, 
post_data.title AS title, 
post_data.body AS body, 
post_data.ip_address AS ip_address, 
post_data.time_stamp AS time_stamp, 
post_category.name AS category_name, 
post_sub_category.name AS sub_category_name, 
post_category.type AS post_type 
FROM post,
post_data,
post_sub_category, 
post_category 
WHERE 
post.sub_category_id = post_sub_category.id AND 
post_sub_category.category_id = post_category.id
GROUP BY post_data.post_id HAVING MAX(post_data.time_stamp)
ORDER BY post_data.id DESC
0 голосов
/ 08 июня 2010

Может ли что-нибудь подобное быть полезным? Я не уверен в этом, поскольку он содержит подзапрос, который доставлял вам неприятности, но в другом месте ...

SELECT post.id AS post_id, 
   post.status AS status, 
   post_data.title AS title, 
   post_data.body AS body, 
   post_data.ip_address AS ip_address, 
   post_data.time_stamp AS time_stamp, 
   post_category.name AS category_name, 
   post_sub_category.name AS sub_category_name, 
   post_category.type AS post_type 
FROM post,
     post_data,
     post_sub_category, 
     post_category 
WHERE post.sub_category_id          = post_sub_category.id AND 
      post_sub_category.category_id = post_category.id     AND
      post_data.post_id             = post_id              AND
      post_data.time_stamp = (SELECT MAX(time_stamp)
                                  FROM post_data
                                  WHERE post_data.post_id = post_id);

Спектакль может не быть чем-то особенным.

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