2009-05-02 6 views
1

이 작업을보다 명확하게 수행 할 방법을 찾고 있습니다. 내 코드는 작동하지만 더 좋을 수도 있습니다. 세 개의 테이블이 있습니다 : 하나는 범주 그룹 목록이 있고, 다른 하나는 범주 그룹에 연결된 범주 목록이 있으며, 다른 하나는 범주에 연결된 뉴스 기사 목록이 있습니다.PHP : MYSQL COUNT 쿼리 (연결된 테이블 포함)

범주 그룹의 모든 이름을 차례로 살펴보고 범주 그룹에있는 범주 이름과 각 범주의 뉴스 기사 수를 차례로 반복해야합니다.

범주 그룹, 범주, 뉴스의 세 가지 테이블이 있습니다.

나는 일련의 쿼리를 가지고있다. 첫 번째 묻습니다 CategoryGroups 테이블에서 모든 행 :

$result = mysql_query(' 
SELECT cat_group_id, cat_group_name FROM CategoryGroups 
'); 

두 번째 쿼리는 첫 번째 쿼리의 루프 결과 내부와 뉴스 항목이 특정 범주 그룹에 연결된 모든 범주를 찾습니다

<?php 
while($row = mysql_fetch_assoc($result)){ 
    $id = $row['cat_group_id'];  
    $name = $row['cat_group_name']; 

echo "<h3>$name</h3>"; 

    $sql = mysql_query(" 
      SELECT category_id, title FROM `Categories` 
      WHERE cat_group_id = $id 
      AND category_id IN 
      (SELECT news.category_id FROM news) 
      "); 
    while($row = mysql_fetch_assoc($sql)) { 
    $title = $row['title']; 
    $catid = $row['category_id']; 
    $numbers = mysql_query(" 
       SELECT * FROM news 
       WHERE category_id =$catid" 
       ); 
    $nums = mysql_num_rows($numbers); 
    echo "$title ($nums)<br/>\n"; 
} 
?> 

효율성을 염두에두고 한두 개의 검색어로 제한하고 싶습니다. 나는이 일을 할 수 있음을 알고 있지만, 나는 내 시도에 성공하지 못했습니다.

감사합니다.

답변

2

"SQL Queries for Mere Mortals"과 같이 SQL 관련 서적을 가져와야합니다.

$sql = mysql_query(" 
     SELECT cg.cat_group_name, c.title, COUNT(n.category_id) AS NumNews 
     FROM `CategoryGroups` cg 
     JOIN `Categories` c USING (cat_group_id) 
     JOIN `News` n USING (category_id) 
     GROUP BY cg.cat_group_name, c.title"); 

결과 출력 위에이어서 루프는 새로운 <h3>마다 cat_group_name 이전 행 다르다.

+0

예. 그가 나를 혼란스럽게 만들었던 원인을 알아 내기 위해 두 번째를 보았다. – DForck42

3

왜 테이블을 조인하지 않습니까? 이 가까이 있어야처럼 테이블 뉴스, 오른쪽 newsid 열 (그것의 것을 얻었다는 일부 기본 키가있는 경우

SELECT cat_group_name, title, count(newsid) 
FROM CatagoryGroups 
INNER JOIN Categories ON cat_group_id 
INNER JOIN News ON category_id 
GROUP BY cat_group_name, title 

이 보인다? 음, 카운트 ;-). 확실한 인덱스를 사용하면 JOIN은 매우 빠르며 PHP 코드는 필요한 모든 출력 형식을 지정할 수 있습니다.