2012-07-01 3 views
0

를 표시합니다 :얻기 라벨은 내가 3 개 MySQL의 테이블이

내가 같은 테이블 형식으로 어떤 선반, 뭔가 어떤 책을 표시해야
shelf 
--------------- 
id 
project_id 
label 


books 
--------------- 
id 
project_id 
label 


booksOnShelves 
--------------- 
id 
shelf_id 
book_id 
project_id 
user_id 

: 지금까지 내가했습니다

History  Fiction 
-------  -------- 
book 1  book 4 
book 2  book 5 
book 3 

에만이있어 : 어떤 이상한 이유로 선반 라벨

SELECT 
     shelf.label, 
     books.label 
    FROM booksOnShelves 
    LEFT JOIN shelf ON (shelf.id = booksOnShelves.shelf_id) 
    LEFT JOIN books ON (books.id = booksOnShelves.book_id) 
    WHERE booksOnShelves.project_id = ".$_POST['pid']." 
    AND booksOnShelves.user_id = ".$_POST['uid']." 

몇 가지 사항을 보여주는 것이 아니라, 내가 쿼리, 난 다른 모든 부분을 제거하는 경우 Ike 책 레이블, 그것은 작동합니다. 또한 하나의 긴 열 (루프를 통해) 만 표시 할 수 있습니다. 어떻게 그것을 별도의 열람 칸으로 나눌 수 있습니까? 아니면 한 열에 만 책 한 권당 한 번만 선반 레이블을 표시하려면 어떻게합니까?

+1

** 귀하의 코드는 SQL 삽입에 취약합니다 ** 매개 변수로 변수를 전달하는 [준비된 명령문] (http://stackoverflow.com/a/60496/623041)을 사용해야합니다. SQL에 대해 평가되지 않습니다. 내가 무슨 말을하는지, 어떻게 고쳐야할지 모르겠다면, [Bobby Tables] (http://stackoverflow.com/questions/332365/xkcd-sql-injection-please-explain)의 이야기를 읽으십시오. . – eggyal

+0

'shelf.id'입니까, 아니면'shelf.label'의 오타입니까? – Neil

+0

@Neil 잘 잡습니다. 단지 레이블이 필요합니다;) – santa

답변

0

는 1 : 타이틀 세트의 문자열을 반환하기 위해 사용 GROUP_CONCAT : 당신이 교차 테이블 leftjoin에서 시작하는 경우, 가입에 남아 넌센스 (IMHO)

위를 삭제 : 입력을 탈출하는 것은

가 2 바르 쉼표는 1 행 당신의 PHP 페이지를 채우기 위해

을 ADD/분석 titlelist을 관리 할 수있다 물론 선반

$pid = mysql_real_escape_string($_POST['pid']); 
$uid = mysql_real_escape_string($_POST['uid']); 

$sql = "SELECT 
     shelf.label, 
     GROUP_CONCAT(books.label separator ',') as titlelist 
    FROM booksOnShelves 
    JOIN shelf ON (shelf.id = booksOnShelves.shelf_id) 
    JOIN books ON (books.id = booksOnShelves.book_id) 
    WHERE booksOnShelves.project_id = ".$pid." 
    AND booksOnShelves.user_id = ".$uid." 
group by booksOnShelves.shelf_id"; 

당, 분리

당신은 당신의 요구로 구분을 변경할 수 있습니다 (예 : |)는

foreach($results as $row){ 

echo "<div class='float_left'><p class='bold'>".$row['label']."</p>\n"; 
// using '|' as separator less common then ',' in the titles 
$array_of_titles = explode('|',$row['titlelist']); 
foreach($array_of_titles as $title){ 
echo "<p>".$title."</p>\n"; 

} 
echo "</div>\n"; 
} 

나는 결과가 쿼리의 모든 행과 연관 배열입니다 $ 가설을 세웠다.

+0

와우, 멋지다. 이걸 출력하는 방법을 모르겠다. – santa

0

SQL은보고 언어가 아닌 (구조화 된) 쿼리 언어입니다. PHP를 사용하면서 HTML을 출력한다고 가정하므로 예를 들어 열을 만들 수 있습니다. 수레 또는 테이블. 그룹화를 수행하는 가장 쉬운 방법은 쿼리 결과를 중첩 된 배열로 읽어 외부 배열 키가 선반 레이블이 될 수 있고 내부 배열 키가 북 레이블이 될 수 있도록 한 다음 배열을 중첩 루프.

+0

흠 ... 배열 조작이 이런 종류의 소리는 내 기술 수준을 약간 넘는 소리지만, 당신이 무슨 뜻인지 이해할 것 같아요 ... – santa