簡體   English   中英

MySQL —在視圖中獲取不同的行

[英]MySQL — Getting distinct rows in a view

好,去 我正在嘗試顯示一個視圖:

+---------+---------+-------+--------+------------+---------------------+---------------+-------------------+-------------+
| 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有一行,並且我希望它是最新的。 有沒有人有什么建議? 在處理軟刪除和諸如此類的事情時,我使用視圖來嘗試使生活變得更輕松,並且從長遠來看,從理論上講,這也使查詢我想要的數據變得更加輕松。

非常感謝!

您可以使用

 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

這樣的東西有用嗎? 我不確定,因為它包含一個子查詢,這給您帶來麻煩,但是在另一個地方...

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);

性能可能也不是值得一提的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM