2013-08-09 3 views
0

mysql 쿼리를 수행하는 방법을 알지 못합니다. 주제 (ID, 이름) 및 게시물 (사용자, 주제, 게시물, 시간) 및 사용자 마지막 주제보기 (주제, 사용자, 시간)에 대한 mysql 테이블이 있습니다사용자가 마지막으로보기에 따라 각 항목에 대한 새로운 게시물 수를 얻으십시오.

작성된 새로운 게시물 수를 얻으십시오. 사용자가 주제를 마지막으로 본 후

첫 번째 것은 아마도 마지막보기를 가져 와서 배열에 추가 한 다음 주제 배열을 가져와야할까요? 어떤 종류의 mysql 쿼리는이 두 배열의 데이터를 포함해야합니까?

결과이어야 (ID => 카운트)

array(1 => 2, 2 => 0, 3 => 15) 

는 그때 만들 수

first topic (2) 
second topic (0) 
third topic (15) 
+0

항상 3 'topics'in array입니까? - 상수는 – jaczes

+0

아니요, 다른 숫자입니다. – user1365447

+0

모든 답변을 확인하겠습니다. – user1365447

답변

0

항목

id | name | 
------------------- 
1 | bla  | 
2 | lala | 

소식

topic_id | user |  time   | 
-------------------------------------------- 
    1  | X  | 2013-08-09 12:00:00 | 
    1  | Y  | 2013-08-09 13:00:00 | 
    2  | Y  | 2013-08-09 12:00:00 | 
-------------------------------------------- 
,363,210

USER_VIEWS 사용자가 포럼을 열고 첫

topic_id | user_id | posts | read | 
    --------------------------------------------- 
    NULL | NULL | NULL | NULL | 
    --------------------------------------------- 

, 당신은

INSERT INTO `user_views` (`topic_id`, `user_id`, `posts`, `read`) 
VALUES (
(SELECT `id` FROM `topics`), 
$_SESSION['user_id'], 
(SELECT COUNT(`topic_id`) FROM `posts` GROUP BY `topic_id`), 
0 
); 

그래서 새 게시물을 추가해야합니다, 그것은되었다 :

USER_VIEWS

topic_id | user_id | posts | read | 
    --------------------------------------------- 
    1  | 5  |  2  |  0  | 
    2  | 5  |  1  |  0  | 
    --------------------------------------------- 

사용자가 topic_id = 1을 열었으므로 게시물이 자동으로 읽히게되었습니다 (어쩌면 각 게시물을 읽는 방법을 추적하지 않음).그래서 주제의 정확한 개방에 :

UPDATE `user_views` SET `read` = (SELECT COUNT(`topic_id`) FROM `posts` WHERE `topic_id` = $_GET['topic_id'] AND user_id = $_SESSION['user_id']; 

지금되었다 :

USER_VIEWS

topic_id | user_id | posts | read | 
    --------------------------------------------- 
    1  | 5  |  2  |  2  | 
    2  | 5  |  1  |  0  | 
    --------------------------------------------- 

이제 새 게시물이 topic_id에서 이루어집니다 = 1 :

게시물

topic_id | user |  time   | 
-------------------------------------------- 
    1  | X  | 2013-08-09 12:00:00 | 
    1  | Y  | 2013-08-09 13:00:00 | 
    2  | Y  | 2013-08-09 12:00:00 | 
    1  | Z  | 2013-08-09 14:00:00 | 
-------------------------------------------- 

T 으로

topic_id | user_id | posts | read | 
    --------------------------------------------- 
    1  | 5  |  3  |  2  | 
    2  | 5  |  1  |  0  | 
    --------------------------------------------- 

USER_VIEWS :

UPDATE `user_views` SET `posts` = (SELECT COUNT(`topic_id`) FROM `posts` WHERE `topic_id` = (SELECT `id` FROM `topics` WHERE `id` = `posts`.`topic_id`) AND user_id = $_SESSION['user_id']; 

그래서이되었다 : 그는 사용자가이 작업을 수행하지 않는 경우에만 게시물 및 뷰를 삽입 할 수있는 새로운 주제,이 경우는 검사, 포럼을 엽니 다 읽지 않은 게시물을 검색 할 수있다 :

SELECT `topic_id`, `user_id`, `posts`-`read` as 'unread' FROM `user_views` WHERE user_id = $_SESSION['user_id']; 

이 반환합니다

,691 363,210

USER_VIEWS

topic_id | user_id | unread | 
    ---------------------------------- 
    1  | 5  |  1  | // 3-2 
    ---------------------------------- 
    2  | 5  |  1  | // 1-0 
    ---------------------------------- 

그래서 마지막 방문에서, 사용자는 이제 각 주제 만 1 새 게시물이 있습니다.

나는 당신이 논리를 가지고 있기를 바랍니다. 어쩌면 세션이나 쿠키에서 이미 본 게시물을 저장하는 것이 더 쉬운 방법 일지 모르지만 나에게는 신뢰할 수없는 것처럼 보입니다. 따라서 새 테이블이 괜찮습니다.

사용자가 포럼을 방문 할 때 처음으로 새 항목을 삽입하는 방법은 앱 로직에 따라 다릅니다.

물론 쿼리에 오류가있을 수 있으므로 최대한 노력해 보았습니다. 이것들은 단지 예일 뿐이므로 앱에 적합하게 만들어야합니다. 즉, $ _GET 또는 $ _SESSION을 쿼리에 직접 삽입하지 않아야합니다.

PS : 나는 POSTS 테이블에 자동 증가 키 열 id을 가지고 제안, 그래서 그것은 즉 SELECT COUNT(id) FROM posts

0
SELECT posts.topic, 
     (SELECT COUNT(*) 
      FROM posts 
     WHERE posts.`time` > views.`time` 
      AND posts.`topic` = topics.`id`) AS counts 
    FROM posts 
    LEFT JOIN topics 
    ON topics.`id` = posts.`topic` 
    LEFT JOIN views 
    ON topics.`id` = views.`topic` 
0

을 시도해보십시오 topic_id, 또한 id에있을 것입니다 쿼리, 더 나은 수행하지 않습니다

SELECT t.id, t.name, COUNT(*) new_posts 
    FROM posts p JOIN topics t 
    ON p.topic_id = t.id LEFT JOIN views v 
    ON t.id = v.topic_id 
    AND v.user_id = 1 
WHERE p.time > COALESCE(v.time, 0) 
GROUP BY t.id, t.name 
HAVING COUNT(*) > 0 

샘플 출력 :

 
| ID | NAME | NEW_POSTS | 
--------------------------- 
| 1 | topic1 |   2 | 
| 2 | topic2 |   1 | 

여기에 SQLFiddle 데모

+0

@ user1365447 도움이 되셨습니까? 질문에 대한 도움이 더 필요하십니까? – peterm

관련 문제