1

ここに合計n00b、最初の投稿なので、建設的にしてください!私は自分自身にPHP/MySQLを教えるために本を購入しましたが、残念ながら普遍的に賞賛されている本ではないので、私の進歩は少し不安定です。

リンクしたいテーブルが2つあります。表1(レコードと呼びましょう)に保持されているすべての情報を表示したいのですが、一度だけ表示します。次に、Recordsの各アイテムがテーブル2(UserTable)の特定のフィールドと一致するかどうかを確認し、一致する場合はチェックボックスをオンにし、一致しない場合は空のチェックボックスを表示します。

私がこれまでに抱えていた問題は、一致するレコードのアイテムのみを表示するか、複数の一致があるレコードの各アイテムの複数のインスタンスを表示することです。私は以下のコードでこれらを解決しました-しかし、おそらく単一のリンクを使用して、これを行うためのより良い方法があるはずだと私は考え続けていますか?

とにかく、ここにコードからのいくつかの抜粋があります:

$sql = "SELECT * FROM Records";
$res = mysqli_query($mysqli,$sql);

while ($iteminfo = mysqli_fetch_array($res, MYSQLI_ASSOC)) {
$recordid2 = $iteminfo['record_id'];

レコードから関連データを引き出してテーブルの作成を開始するセクションを省略しました。次に、次のようにします。

$sql2 = "SELECT COUNT(*) AS matches FROM UserTable 
where usertable.item = '$recordid2' and User_ID = '$current_user_id'";

$res2 = mysqli_query($mysqli, $sql2);
$matches = mysqli_fetch_array($res2, MYSQLI_ASSOC);
$matches2 = $matches['matches'];

if ($matches2) {
        $output = "<input type='checkbox' name='test' checked>"; } else {
        $output = "<input type='checkbox' name='test'>";

私が言っているように、これは機能しますが、少し不器用に感じます-レコード内のすべてのアイテムに対して個別のネストされたクエリを実行しているため、時間の経過とともに非常に遅くなる可能性があります。UserTableに一致するものがあるかどうかに応じて、すべての行情報(1回)と0または1を取得する、全体に対して単一のクエリを実行する方法はありますか?DISTINCTを使用してみましたが、機能しませんでした。

4

2 に答える 2

0

これはどう:

SELECT * FROM Records
LEFT JOIN (
    SELECT usertable.item, COUNT(User_ID) AS matches FROM UserTable
    WHERE User_ID = '$current_user_id'
    GROUP BY usertable.item
) as UserTable ON record_id = usertable.item

これにより、すべてのレコードがフェッチされ、UserTable内の指定されたユーザーIDに一致する行のみがフェッチされます(ユーザーIDを変更して、別のユーザーの詳細をフェッチします)。

Recordに行が存在するが、UserTableに一致する行が存在しない場合、「一致」はNULLになります。それ以外の場合は、ゼロより大きい数値にする必要があります。

これをPHPで実行するだけで、チェックボックスを処理できます。(ゼロより大きい一致をチェックし、見つかった場合にのみ、「チェック済み」属性を出力します)

<input type="checkbox" name="test" <?=((int)$record['matches'] > 0) ? 'checked="checked"' : ''; ?> />
于 2012-11-07T22:54:21.677 に答える
0

アプローチが不器用であることに気づいたことでよくやった。時間をかけてSQL言語を確認し、理解を深めてください。特に、参加する方法を学びたいと思います。おそらく内部結合。他のタイプは、FULL OUTER JOIN、LEFT OUTER JOIN、およびRIGHTOUTERJOINです。

手続き型コードで結合を行うのではなく、SQLで行うことをお勧めします。次に、DBを1回呼び出します。

select records.field1, records.field2, matches.field1, matches.field2
from records
   , matches
where records.field = matches.field;

必要な結果が得られるまでこのクエリを試してから、PHPからこれを呼び出します

$sql = <query from above>
$res = mysqli_query($mysqli,$sql);

これの良い点の1つは、SQL言語がかなり転送可能であることです。Access to Oracleのすべてのフォームは、同様の構文を使用します。また、使用している手続き型言語(PHP、.NETなど)に関係なく、この知識を使用できます。

幸運を。

于 2012-11-07T22:55:05.027 に答える