0

これはもう少し複雑で、innerjoin などでは実行できません。私はすでにそれについて助けを得ましたが、私はそれを理解できませんでした。結果を取得するときに、あるテーブルからテキスト行を取得し、別のテーブルのクエリに挿入する必要があります。('2','3','4')1つには、maintable の ID へのリンクを保存します。したがって、それらを取得するには、最初にそれらをテーブルから取り出して php に挿入する必要があります。次に、関連する行を取り出して xml に保存します。重要な部分は次のとおりです。

$name = ($_GET["name"]);
$query =  "SELECT Favorites FROM $table_id2 WHERE Name = $name";

while($favoritesstring = mysql_fetch_assoc(mysql_query($query, $dbconnect))){
$favoritestringresult = $favoritesstring['Favorites'];
} 

$string = stripslashes($favoritestringresult['Favorites']);

$query = "SELECT Name,Comment,ID FROM $table_id WHERE ID in " .$string;

$dbresult = mysql_query($query, $dbconnect) or die(mysql_error() . ' Query: ' . $query);
4

3 に答える 3

3

警告:

mysql_*関数を使用して新しいコードを記述しないでください。それらはもはや保守されておらず、コミュニティは非推奨プロセスを開始しています。赤いボックスが見えますか?

代わりに、準備済みステートメントについて学び、 PDOまたはMySQLiのいずれかを使用する必要があります。この記事では、使用する API を決定する方法について詳しく説明します。PDO については、ここに良いチュートリアルがあります。

次のデータベース設定を検討してください。

-- This contains the elements: books, videos, albums.
CREATE TABLE IF NOT EXISTS `entries` (
    `id` int(11) NOT NULL AUTO_INCREMENT,
    `name` varchar(255) NOT NULL,
    `comment` varchar(255) NOT NULL,
    PRIMARY KEY (`id`)
) ENGINE=InnoDB;

-- This contains what our users favourited.
-- row_id: row identifier index
-- name: the name of the user to search for
-- entry_id: the id of the entry we search for, this will
--           make our JOIN relation towards entries.id
CREATE TABLE IF NOT EXISTS `favorites` (
    `row_id` int(10) NOT NULL AUTO_INCREMENT,
    `name` varchar(64) NOT NULL,
    `entry_id` int(10) NOT NULL,
    PRIMARY KEY (`row_id`)
) ENGINE=InnoDB;

もちろん、いくつかの任意のデータを入れてください:

INSERT INTO `entries` (`id`, `name`, `comment`) VALUES
    (1, 'Foobar', 'Bazqux'),
    (2, 'Barbaz', 'Quxfoo');

INSERT INTO `favorites` (`row_id`, `name`, `entry_id`) VALUES
    (1, 'someguy', 1),
    (2, 'someguy', 2),
    (3, 'person', 2);

データベースにクエリを実行するには、基本的なスクリプトが必要です。

mysql_connect("localhost", "username", "password");
mysql_select_db("database");

$result = mysql_query('SELECT entries.id, entries.name, entries.comment
    FROM entries
    INNER JOIN favorites ON entries.id = favorites.entry_id
    WHERE favorites.name = "' .mysql_real_escape_string($_GET['name']). '"');

while ( $row = mysql_fetch_assoc($result) )
    var_dump($row);

mysql_close();

$_GET['name']の値を与えるsomeguyと、結果は次のようになります。

array (
  'id' => '1',
  'name' => 'Foobar',
  'comment' => 'Bazqux',
)
array (
  'id' => '2',
  'name' => 'Barbaz',
  'comment' => 'Quxfoo',
)

の値を使用すると、次のpersonようになります。

array (
  'id' => '2',
  'name' => 'Barbaz',
  'comment' => 'Quxfoo',
)

その秘訣は にありINNER JOINます。私たちの検索パターンであるWHERE句は、入力であるfavorites.entry_id場所を検索することをデータベースに伝えfavorites.nameます。そこから、JOIN検索を拡張する 2 つのテーブル間のリンクを作成します。は、 と等しい行のみが返されることINNER JOINを意味します。そしてもちろん、ステートメントにリストされたフィールドをフェッチします。結局のところ、これがデータベースに指示したことです。もう少し、視覚的な説明。entries.idfavorites.entry_idSELECT

そして、ここからwhile(){}構造内で、取得したデータを使って好きなことを行うことができます。

field IN (value1, value2)すべての ID を取得してステートメントに挿入する代わりにINNER JOIN、MySQL のリレーショナル構造を利用するため、パフォーマンスと保守性が向上します。

そして、私が別の人と同様の問題について話し合っているときにチャットで言ったように:

MySQL で構築できる複雑さは、想像を超える場合があります。肝心なのは、最初にデータベースが適切にモデル化されていることを確認する必要があるということです。後は、あるフィールドを別のフィールドにどのようにリンクするかだけです。phpMyAdmin、LibreOffice Base、または Microsoft Access などのツールは、キー間の関係をモデル化するためのグラフィカル インターフェイスで非常に役立ちます。

于 2012-08-05T15:09:53.490 に答える
1

2 つのクエリを見ると、これは次のように実行できます。

"SELECT t1.ID, t1.Name, t1.Comment FROM $table_id t1 LEFT JOIN $table_id2 t2 ON t1.ID = t2.Favorites WHERE t2.Name = $name"

との関係がよくわからないLEFT JOINのでここいます。$table_id$table_id2

于 2012-08-04T14:30:36.817 に答える
1

これには多くの可能な解決策があります。1 つはサブクエリを使用する方法です。

SELECT  name, comment, id
FROM    table_id
WHERE   ID in   (
                    SELECT  Favorites
                    FROM    table_id2
                    WHERE   Name = $name
                )

より効率的な別の方法は、INNER JOIN

SELECT a.ID, a.Name, a.Comment 
FROM    table_id a 
            INNER JOIN JOIN table_id2 b 
                ON a.ID = b.Favorites 
WHERE b.Name = $name
于 2012-08-04T14:45:34.390 に答える