SELECT
t.storyid as storyid,○
t.shop_cat_id as shop_cat_id,○
s.title as title,
s.title_r as title_r,
s.salescopy_01 as salescopy_01,
p.ken as address_01,●
s.address_02 as address_02,
s.phone_0101 as phone_0101,
s.phone_0102 as phone_0102,
s.phone_0103 as phone_0103,
s.site_url as site_url
FROM
shop_cat_to_subcat_to_shop as t○
LEFT JOIN○
shop_master as s
LEFT JOIN●
prefecture_master as p●
ON
t.storyid = s.storyid○
AND○
t.shop_cat_id = $shop_cat_id○
AND●○
s.address_01 = p.id●
このSQL文は文法的に間違いがありますか?シンタックスエラーが出ます。
書ききれないので、コメント欄に続きがあります。
意味が違ってくるかどうかまで検証できていないですが、「onでの条件指定」の記述位置と「参照する表」の記述位置がおかしいと思います。
SELECT t.storyid as storyid, t.shop_cat_id as shop_cat_id, s.title as title, s.title_r as title_r, s.salescopy_01 as salescopy_01, p.ken as address_01, s.address_02 as address_02, s.phone_0101 as phone_0101, s.phone_0102 as phone_0102, s.phone_0103 as phone_0103, s.site_url as site_url FROM shop_cat_to_subcat_to_shop as t LEFT JOIN shop_master as s ON t.storyid = s.storyid AND t.shop_cat_id = $shop_cat_id LEFT JOIN prefecture_master as p ON s.address_01 = p.id
つまり、私の知っている文法では表結合を行う際3っつ以上のテーブルを指定できないのでは?と思っています。3っつ以上指定するやり方があると思うのですが・・・参考書やネットの例題は2つまでで確認が取れません。
○と●は付けないで実行しています。
あと変数の中身はechoで確認してあります。
PEARのDBクラスを使用していますので、;は付けていません。EOSの中ををコピペしています。
この質問はテーブル構造や変数の中身は何回も確認してますので無視し、DBクラスを絡めた文法の質問を重視してください。
前回http://q.hatena.ne.jp/1175208593の続きですが前回の質問はあまり関係ないかもしれません。
よろしくお願いします。
コメントは削除されているようですが、いろいろなご指導ありがとうございます。
私は、独学なので経験豊富な方の助言は非常に勉強になります。
また、当方の稚拙な質問や考えなどをわざわざ気にしていただき、また、検証までされて回答されていることが非常にうれしく思います。
> 値は、'$shop_cat_id'のように、コーテーションで囲む癖をつけた方がいいと思います。
このようなアドバイスは一人で学習しているものにとっては考えもつかないことでして、ありがたい限りなのです。
nandedarouさんや皆さんのおかげで、少しずつ上達していると思いますが、今後もくだらないことでつまづくかもしれません。
そのときは面倒を見てやってください^^
では、やはり大したことではないのですが、もうちょっと書きます。
フィールド名の前のt. s. p. は、同じ名前のフィールドがSQL内の他のテーブルにないなら、つけなくても構いません。(つけた方がどのテーブルのフィールドかが人間にわかり易いので、あえてつけるのもありだとは、思います。)
フィールド名の後のasについては、消したコメントに書いたとおり、フィールド名を変更しないならば、つける必要はありません。
あと、これはseadwellさんが何をしたいかによって違ってくるのですが、もし$shop_cat_idに対応したものだけ抽出したいなら、次のようにwhereを使った方がいいように思います。
SELECT
t.storyid,
t.shop_cat_id,
s.title,
s.title_r,
s.salescopy_01,
p.ken as address_01,
s.address_02,
s.phone_0101,
s.phone_0102,
s.phone_0103,
s.site_url
FROM
shop_cat_to_subcat_to_shop as t
LEFT JOIN shop_master AS s USING(storyid)
LEFT JOIN prefecture_master AS p ON s.address_01 = p.id
WHERE t.shop_cat_id = '$shop_cat_id'
お礼が遅くなり失礼しました。出張が重なり・・・^^;
前回http://q.hatena.ne.jp/1175208593の質問で、あまりwhereを使ってはいけないのか?と思っていましたが、使ったほうが明示的になる場合whereの必用もあるということですね^^
ありがとうございます。