制約定義のないMySQLデータベースがあり、このデータベースのテーブル関係に関する情報を含むPHPの多次元配列もあります。配列は次の形式です (例のみ)。
array(20){
ps_attribute_lang => array(2) {
id_attribute => array(2) {
totable => "ps_attribute" (12)
tocolumn => "id_attribute" (12)
}
id_lang => array(2) {
totable => "ps_lang" (7)
tocolumn => "id_lang" (7)
}
}
ps_cart => array(4) {
id_lang => array(2) {
totable => "ps_lang" (7)
tocolumn => "id_lang" (7)
}
id_address_delivery => array(2) {
totable => "ps_address" (10)
tocolumn => "id_address" (10)
}
id_address_invoice => array(2) {
totable => "ps_address" (10)
tocolumn => "id_address" (10)
}
id_customer => array(2) {
totable => "ps_customer" (11)
tocolumn => "id_customer" (11)
}
}
ps_cart_product => array(1) {
id_product => array(2) {
totable => "ps_product" (10)
tocolumn => "id_product" (10)
}
}
...
}
今、あるテーブルから別のテーブルへのパスをこのデータベース内でどのように見つけることができるのか疑問に思っています。
例を挙げましょう。データベースに次のテーブルがあるとします。
- states(id_state, name)
- 都市(id_city, id_state, name)
- 通り(id_street, id_city, name)
- 家(id_house, id_street, color, number)
- people(id_house, 名前)
ここで、いくつかのプロパティを持つ家 (たとえば、シカゴにあるすべての青い家) を検索したいとします。このためには、SQL コマンドを生成する必要があります。¨
SQL の SELECT 部分は単純です (例: SELECT houses.id
)。SQL の WHERE 部分も非常に単純です (例: WHERE cities.name = 'Chicago' AND house.color = 'blue'
)。問題は、SQL の JOIN 部分でテーブルを「接続」することにあります。
この多次元関係配列を検索して、SQL の WHERE 部分と SQL の SELECT 部分からの条件を含むすべてのテーブルを接続するパスを見つけるだけです。
この場合、私はこれを取得したい:
SELECT house.id
FROM house
JOIN street ON(house.id_street = street.id)
JOIN city ON(street.id_city = city.id)
WHERE house.color = 'blue' AND city.name = 'chicago'
この構造からこの種の情報を取得できるアルゴリズムを知っていますか?
前もって感謝します!