カスタムブロック内に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文を結合させるにはどうしたらよいでしょうか?
よろしくお願いします。
UNION は「同一構造を持つもの同士を結合する時に使うもの」ですが
$sql = "SELECT * FROM ".$xoopsDB->prefix("stories")." WHERE published>0";
の結果と
$sql = "SELECT * FROM ".$xoopsDB->prefix("xoopscomments");
の結果は同じ構造をしていますか?
何をしたいのかが判らないので具体的には何とも言えませんが
結合するとすればJOINになりますのでユーザーズグループの
下記のやり取りが役に立つのではないかと思います。
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箇所だけになりますのでお間違いなく。
大変わかりやすい説明ありがとうございました。
意図しようとしていたことが無事UNION ALLを使いまして実現することができました。
なるほど。UNIONは同じ構造でないと使えないということですか。
では、同じ構造のsql文であった場合の結合の仕方を教えていただけますか?
以下のsql文をUNION ALLを使ってつなげるとどうなるのでしょうか?
$sql = "SELECT * FROM ".$xoopsDB->prefix("xoopscomments");
$sql = "SELECT * FROM ".$xoopsDB->prefix("xoopscomments");