xoopsのphpについて質問です。


カスタムブロック内にphpを記述しております。

global $id,$xoopsDB,$xoopsTpl;

$myts =& MyTextSanitizer::getInstance();
$sql = "SELECT * FROM ".$xoopsDB->prefix("stories")." WHERE published>0";
$sql = "SELECT * FROM ".$xoopsDB->prefix("xoopscomments");

$result = $xoopsDB->query($sql, 15, 0);

while ( $myrow = $xoopsDB->fetcharray($result) ) {

$storyid = $myts->makeTboxData4show($myrow["storyid"]);

$created = formatTimestamp($myrow['created'],"m/d");
$com_itemid = $myts->makeTboxData4show($myrow["com_itemid"]);


echo "
".$storyid."
".$com_itemid."
";

}

「stories」と「xoopscomments」のsql文をUNION句を使って結合したいと考えています。
$sql = "SELECT * FROM ".$xoopsDB->prefix("stories")." WHERE published>0";
$sql = "SELECT * FROM ".$xoopsDB->prefix("xoopscomments");
上記のsql文を結合させるにはどうしたらよいでしょうか?

よろしくお願いします。

回答の条件
  • 1人2回まで
  • 登録:2007/07/13 00:43:45
  • 終了:2007/07/14 19:00:08

回答(2件)

id:kn1967 No.1

kn1967回答回数2915ベストアンサー獲得回数3012007/07/13 14:12:53

ポイント35pt

UNION は「同一構造を持つもの同士を結合する時に使うもの」ですが

$sql = "SELECT * FROM ".$xoopsDB->prefix("stories")." WHERE published>0";

の結果と

$sql = "SELECT * FROM ".$xoopsDB->prefix("xoopscomments");

の結果は同じ構造をしていますか?


何をしたいのかが判らないので具体的には何とも言えませんが

結合するとすればJOINになりますのでユーザーズグループの

下記のやり取りが役に立つのではないかと思います。

Xoops Users Group Japan - 新しくコメントがついた記事一覧を表示するカスタムブロック

id:kitty12345

なるほど。UNIONは同じ構造でないと使えないということですか。

では、同じ構造のsql文であった場合の結合の仕方を教えていただけますか?

以下のsql文をUNION ALLを使ってつなげるとどうなるのでしょうか?

$sql = "SELECT * FROM ".$xoopsDB->prefix("xoopscomments");

$sql = "SELECT * FROM ".$xoopsDB->prefix("xoopscomments");

2007/07/13 15:12:35
id:kn1967 No.2

kn1967回答回数2915ベストアンサー獲得回数3012007/07/13 15:23:13

ポイント35pt
SELECT * FROM テーブル名1 UNION ALL SELECT * FROM テーブル名2

という書き方になりますので

1回で書くなら

$sql = "SELECT * FROM ".$xoopsDB->prefix("xoopscomments")." UNION ALL SELECT * FROM ".$xoopsDB->prefix("xoopscomments");

2回に分かれるなら

$sql = "SELECT * FROM ".$xoopsDB->prefix("xoopscomments");
$sql .= " UNION ALL SELECT * FROM ".$xoopsDB->prefix("xoopscomments");

余談ですが

SELECT * FROM テーブル名1 UNION ALL SELECT * FROM テーブル名2 UNION ALL SELECT * FROM テーブル名3

というように幾つものテーブルあるいはビューを一度に結びつける事も可能です。

(ただし幾つまで結びつける事ができるのかはデータベース側の仕様や

サーバ環境によりますので一概には言えませんがパフォーマンスを考えると

20も30も結びつけたりするという事は稀だと思いますので特に意識する必要も無いでしょう)

2つの場合もそれ以上の場合もSQLの終端を示すセミコロンを入れる場合は一番末尾の1箇所だけになりますのでお間違いなく。

id:kitty12345

大変わかりやすい説明ありがとうございました。

意図しようとしていたことが無事UNION ALLを使いまして実現することができました。

2007/07/14 02:24:21

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません