0

まず第一に、私の貧弱なトピックのタイトルを失礼します。この質問をどのように作成するか、またはGoogleに何を求めればよいかわからないので、これが簡単に答えられるものである場合は、私を撃たないでください。

次のテーブルがあると仮定します。

[作成者]id、name

[ニュース]id、item、author_id

ニュースアイテムを表示し、対応する作成者(author_idに格納されている)を出力する場合は、次のクエリを実行します。

SELECT * FROM `news` JOIN `authors` ON news.author_id = authors.id

そして、このようなことをして出力します

$Q = "SELECT * FROM news JOIN authors ON news.author_id=news.id";

$query = $this->lite->query($Q) or die($this->lite->error); 

$result=null; while($obj = $query->fetch_object()){
        $result.= '<li>'.$obj->item. 'by ' . $obj->name . '</li>';
}

ここで、$ obj-> nameには作成者の名前が含まれ、正常に出力されます。

では、代わりに「名前」フィールドが「アイテム」と呼ばれた場合はどうなりますか?明らかにいくつかの衝突があるでしょう。Propel&symfonyでの以前の経験では、getAuthorId()-> getName()のようなことをしますが、このプロジェクトでは、SQLを最初から作成する必要があります。

4

3 に答える 3

6

*本番コードでは構文を使用しないでください。

クエリを次のように書き直します。

SELECT  news.item AS news_item, author.name AS author_name
FROM    `news`
JOIN    `authors`
ON      news.author_id = authors.id

、名前の競合を避けるために、必要に応じてフィールドのエイリアスを作成します。

于 2009-07-09T19:10:27.670 に答える
1

news.item や authors.item などの修飾名を使用する必要があります。

于 2009-07-09T19:11:33.767 に答える
0

明示的に名前を付けます

SELECT  n.id, n.item, n.author_id,a.name,a.id 
FROM 
`news` as n JOIN `authors` as a 
ON 
n.author_id = n.id

;

または、おそらくもっと似ています

SELECT  n.id as newsid, n.item as newsitem, n.author_id as autohor_authorid,
a.name as authorname,a.id as authorid 
FROM 
`news` as n JOIN `authors` as a 
ON 
n.author_id = n.id;

実際に必要な列だけを引き出す必要があります。select * を実行したり、関心のある列に常に名前を付けたりするのは悪いスタイルと見なされます。または、たとえば別の列がテーブルに追加された場合にコードを簡単に壊してしまいます。

于 2009-07-09T19:19:26.483 に答える