2010-05-20 3 views
1

OK, c'est parti. Je suis en train de faire une vue qui montre ceci:MySQL - Obtenir des lignes distinctes dans une vue

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

La requête qui a fait cela est:

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 

Mais, car il a une requête imbriquée, je ne peux pas l'utiliser comme vue . À l'heure actuelle la meilleure requête que je peux penser qui fonctionne comme une vue est le suivant:

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 

Mais que tout retourne:

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

Je ne veux qu'une seule ligne par post_id, et je veux que ce soit la le plus récent. Est-ce que quelqu'un a des suggestions? J'utilise des vues pour essayer de rendre la vie plus facile quand il s'agit de traiter des choses telles que les suppressions logicielles et autres, et aussi, théoriquement, de faire des requêtes sur les données que je veux plus facilement à long terme.

Merci beaucoup d'avance!

Répondre

0

Est-ce que quelque chose comme ceci serait utile? Je ne suis pas sûr à ce sujet, car il contient une sous-requête, ce qui vous donnait du mal, mais dans un endroit différent ...

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

La performance pourrait ne pas être rien d'enthousiasmant non plus.

1

Vous pouvez utiliser

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

pour obtenir que la nouvelle ligne. La requête complète peut donc ressembler à ceci:

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 
Questions connexes