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']."

カップルのこと...何らかの奇妙な理由で棚のラベルが表示されませんが、本のラベルなど、クエリ内の他のすべての部分を削除すると機能します。また、(ループを介して) 1 つの長い列にしか表示できません。それを別々の列に分割するにはどうすればよいですか? または、1 つの列の場合、本のグループごとに棚ラベルを 1 回だけ表示するにはどうすればよいですか?

4

2 に答える 2

0

SQL は単なる (構造化された) クエリ言語であり、レポート言語ではありません。PHP を使用しているため、HTML を出力することを想定しているため、フロートやテーブルなどを介して列を作成できます。グループ化を行うための最も簡単な方法は、クエリ結果をネストされた配列に読み込むことです。これにより、外側の配列キーが棚のラベルになり、内側の配列キーが本のラベルになり、配列をネストされたループ。

于 2012-07-01T23:46:06.397 に答える
0

1つ目: 入力変数のエスケープ

2番目:クロステーブルから開始する場合、結合のLEFTを削除します leftjoinはナンセンスです(IMHO)

3 番目: GROUP_CONCAT を使用して、一連のタイトルの文字列をカンマ区切りで、シェルフごとに 1 行で返します。

$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";

もちろん、PHP はページを埋めるためにタイトルリストを解析/管理する必要があります

追加

必要に応じて区切り記号を変更できます (例: |)。

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";
}

$results は、クエリのすべての行を含む連想配列であると仮定しました。

于 2012-07-01T23:47:44.443 に答える