2

どなたか答えていただける方に質問です。これについての私の経験不足をお許しください。しかし、これは私が試みた最初のプロジェクトであり、これはすべて私にとって本当に新しいものです。私は、php と mySQL を使用して職場で在庫システムを構築しようとしていますが、現在人々に貸し出されているアイテムをどのように表示するかについて、少し壁にぶつかっています。

ユーザーにプロビジョニングされているアイテムが 4 つのカテゴリに分類されており、これらのアイテムの貸与の記録が 4 つの異なるテーブルに格納されています。ユーザー用の別のテーブルと、アイテムとその特性のテーブルもあります。

ページが表示されたときに、各ユーザーに割り当てられているすべてのアイテムをテーブルにまとめて表示したい。これを行う方法について 2 つのアイデアがありますが、どちらが最善の方法かはわかりません。

私が最初に考えたのは、ユーザー テーブルからすべてのユーザーを取得して配列に格納し、次に 4 つのローン テーブルからすべての情報を取得して、各テーブルを配列に格納することでした。そこから私は次のようなことをします

for($i=1;$i>sizeof($usersArray);$i++){
   for($a=1;$a>sizeof($loanTable1Array);$a++){
        if($userArray[$i][userID] == $loanTable1Array[$a][userID]{
            //list items
        }
    }
   for($b=1;$b>sizeof($loanTable2Array);$b++){
        if($userArray[$i][userID] == $loanTable2Array[$b][userID]{
            //list items
        }
    }
   for($c=1;$c>sizeof($loanTable3Array);$c++){
        if($userArray[$i][userID] == $loanTable3Array[$c][userID]{
            //list items
        }
    }
   for($d=1;$d>sizeof($loanTable4Array);$d++){
        if($userArray[$i][userID] == $loanTable4Array[$d][userID]{
            //list items
        }
    }
}

ただし、これに関する私の懸念は、約 100 ~ 150 人のユーザーがいて、各テーブルに平均 100 個の異なるアイテムがあることです。これは、ループの約 40,000 ~ 60,000 回の反復を意味します。

私の他のアイデアは、ユーザー テーブルからすべてのエントリを取得し、そのデータを使用して、このような where ステートメントで userID を使用して他の 4 つのテーブルをクエリすることでした。しかし、ループ内にクエリがある場合、それは間違っていると読みました。

$sql = "SELECT userID FROM users";
$allUsers = runQuery($sql); //data is sanitized before running the query
for($i = 1; $i<sizeof($allUsers); $i++){
    $loan1sql = "SELECT * FROM loantable1 WHERE userID = {$allUsers[$i][$userID]}'";
    $loan1Items= runQuery($loan1sql);
    for($a = 1; $a<sizeof($loan1Items); $a++){
        //list items
    }
    $loan2sql = "SELECT * FROM loantable2 WHERE userID = '{$allUsers[$i][$userID]}'";
    $loan2Items= runQuery($loan2sql);
    for($b = 1; $b<sizeof($loan2Items); $b++){
        //list items
    }
    $loan3sql = "SELECT * FROM loantable3 WHERE userID = '{$allUsers[$i][$userID]}'";
    $loan3Items= runQuery($loan3sql);
    for($c = 1; $c<sizeof($loan3Items); $c++){
        //list items
    }
    $loan4sql = "SELECT * FROM loantable4 WHERE userID = '{$allUsers[$i][$userID]}'";
    $loan4Items= runQuery($loan4sql);
    for($d = 1; $d<sizeof($loan1Items); $d++){
        //list items
    }
}

これを行うと、ページがロードされるたびにデータベースへの 400 ~ 600 回の呼び出しが発生します。私の最善の行動方針について誰か意見がありますか? どんな助けでも大歓迎です。

4

2 に答える 2

2

追加のcategory列を考慮することで、4 つではなく 1 つにすることができますloantableJOIN次に、テーブルを ing して1 つのクエリを使用します。

それを行う1つの方法を示す単なる例:

-- Table structure for table `users`

CREATE TABLE IF NOT EXISTS `users` (
  `userID` int(11) NOT NULL AUTO_INCREMENT,
  PRIMARY KEY (`userID`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 ;

-- Dumping data for table `users`

INSERT INTO `users` (`userID`) VALUES
(1),
(2);

-- --------------------------------------------------------

-- Table structure for table `loantable`

CREATE TABLE IF NOT EXISTS `loantable` (
  `ID` int(11) NOT NULL AUTO_INCREMENT,
  `category` int(11) NOT NULL,
  `userID` int(11) NOT NULL,
  PRIMARY KEY (`ID`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 ;

-- Dumping data for table `loantable`

INSERT INTO `loantable` (`ID`, `category`, `userID`) VALUES
(1, 1, 1),
(2, 2, 1),
(3, 3, 1),
(4, 1, 2),
(5, 3, 2);

次に、次のようなクエリを 1 つだけ使用します。

SELECT  *
FROM
    `users`
    LEFT OUTER JOIN loantable ON loantable.userID = users.userID
WHERE   1
ORDER BY
    users.userID
    ,category
于 2013-10-12T09:04:10.797 に答える
0

(上記の回答を参照してください。コメントとして追加するには長すぎましたが、役立つと思いました)

@cartalot と @Uours ありがとうございます!!!! - 早い段階ですべてのローンに対して 1 つのテーブルを作成することを検討していましたが、その実装方法がわかりませんでした。ただし、これは完全に理にかなっています。私の全体の問題は、外部キー - mySQL の親キー制約と、実際にテーブルを結合してページに情報を表示する方法を混同していました。

完全な馬鹿のように聞こえるわけではありませんが、これは将来これを読む人にとって建設的かもしれないと思います. myPHPAdmin で fk - pk 関係を作成する方法と、それらが実際に行うことについて混乱しました。これらの関係は、テーブルを結合するために必要だと思いました (明らかに間違っています)。私は視覚的なつながりを見ましたが、これらのテーブルはどういうわけか「接続」されていました。

外部キーの親キーを作成するときに、基本的に行うことは、別のテーブルの内容に基づいてテーブルに入力できるデータを制限することだけであることを理解しています。これらの制約なしで、異なるテーブルからの情報を結合できます。

于 2013-10-14T01:41:02.777 に答える