2

私は一日中この問題に頭を悩ませてきました、そして私は単純にそれを解決することができません。SQL結合を試して使用しようとしたのはこれが初めてですが、基本的なことを少し教えてもらったので、もう少し高度なものにプッシュすることにしました。

基本的に私は自分のフォーラムを作っています、そして私は2つのテーブルを持っています。f_topics(スレッド)およびf_groups(フォーラムまたはカテゴリ)。f_topicsのtopicBaseとf_groupsのgroupIDの間には関係があり、これは各トピックがどのグループに属しているかを示します。各トピックには、topicIDと呼ばれる一意のIDがあり、groupIDと呼ばれるグループに対して同じです。

基本的に、これらすべての列を1つのSELECTステートメントにまとめようとしています。トピックのタイトル、トピックが投稿された日付、トピックが属するグループのID、およびそのグループの名前です。これは私が使おうとしていたものですが、トピックがgroupID 2にある場合でも、グループは常に1として返されます。

$query=mysqli_query($link, "

SELECT `topicName`, `topicDate`, `groupName`, `groupID`
FROM `f_topics`
NATURAL JOIN `f_groups`
WHERE `f_topics`.`topicID`='$tid';


") or die("Failed to get topic detail E: ".mysqli_error());
var_dump(mysqli_fetch_assoc($query));

これがあまり意味をなさない場合、そして私のロジック全体が完全に間違っている場合は申し訳ありませんが、もしそうなら、別の方法を提案できますか?

読んでくれてありがとう!

4

3 に答える 3

2

テーブルを結合するには、外部キーをマップする必要があります。グループテーブルにgroupIDフィールドがあると仮定すると、これはそれらを結合する方法です:

SELECT `topicName`, `topicDate`, `groupName`, `groupID`
FROM `f_topics`
LEFT JOIN `f_groups`
ON `f_topics`.`groupID` = `f_groups`.`groupID`
WHERE`f_topics`.`topicID`='$tid';
于 2013-01-30T18:23:34.410 に答える
0

避けることをお勧めしますNATURAL JOIN

主な理由は、他の参照テーブルの列名と一致する参照テーブルに新しい列を追加することによって、動作中のクエリが壊れる可能性があるためです。

第 2 に、SQL の読者 (レビュー担当者) にとって、どの列がどの列と一致しているかは、両方のテーブルを注意深く確認しないと明確ではありません。(そして、誰かがクエリを壊した列を追加した場合、列が追加される前の JOIN 基準が何であったかを理解することはさらに難しくなります。


代わりに、ON 句の述語で列名を指定することをお勧めします。

また、すべての列参照をテーブル名で修飾するか、できれば短いテーブル エイリアスで修飾することをお勧めします。

より単純なステートメントについては、これが不要なオーバーヘッドのように見えることに同意します。しかし、ステートメントがより複雑になると、このパターンはステートメントの可読性を大幅に向上させます。

2 つのテーブルの定義がないので、仮定を立てる必要がありgroupIDます。これらのテーブルの両方に列があり、それが同じ名前の唯一の列であると「推測」します。しかし、そのtopicBase列がf_topicsに一致groupIDすることを指定しますf_groups。(そして、NATURAL JOIN ではそれができません。)

あなたが望む結果セットは、このクエリによって返されると思います:

SELECT t.`topicName`
     , t.`topicDate`
     , g.`groupName`
     , g.`groupID`
  FROM `f_topics` t
  JOIN `f_groups` g
    ON g.`groupID` = t.`topicBase`
 WHERE t.`topicID`='$tid';

列が NULL になるか、f_groups.GroupID 値と一致しない値が含まれる可能性がありtopicBase、f_group からの列が NULL として返された (一致がない場合) トピックを返したい場合は、次を取得できます。それは外部結合です。

その動作を取得するには、上記のクエリで、キーワードのLEFT直前にキーワードを追加しますJOIN

于 2013-01-30T19:06:25.783 に答える
0

したがって、私が収集したものから、f_groups テーブルの groupID 列を参照する「topicBase」という名前の f_topics の列があります。

その前提に基づいて、INNER JOIN または LEFT JOIN のいずれかを実行できます。INNER では両方のテーブルにエントリが必要ですが、LEFT では f_topics にデータのみが必要です。

SELECT
    f_topics.topicName,
    f_topics.topicDate
    f_groups.groupName
    f_groups.groupID
FROM
    f_topics
INNER JOIN
    f_groups
    ON
    f_topics.topicBase = f_groups.groupID
WHERE
    f_topics.topicID = '$tid'
于 2013-01-30T18:25:10.440 に答える