使用PHP,如何跨这三个表查询这个mySQL数据库


Using PHP, how do I query this mySQL database across these three tables?

我讨厌提交一个新问题,但是每个人都有一些细微的不同,足以使这个问题看起来有必要问。

用户输入一个供应商的名字,然后在一个列表中看到他们从该公司购买的所有"种类"的东西,按库存最低排序。

简介:我有三张桌子。
还有比这些更多的字段,但这些是相关的(据我所知)。

stuff_table
Stuff_vendor_name *(使用$user_input搜索此字段,但每个lookup_type只有一个结果)*
lookup_type

lookup_table
lookup_type
Lookup_quantity (order by this)
category_type

category_table
category_type
Category_location(检查这个字段是否== $this_location,这个字段已经被分配了)

文字说明:用户正在搜索仅包含在stuff_table中的值——每个lookup_type的不同的stuff_vendor_name值。每个物品都可以从多个来源购买,这样做的目的是看看是否有任何供应商曾经出售过任何类型的物品。

但是结果需要在lookup_table中ORDER BY the lookup_quantity

重要的是,我必须检查他们是否正在搜索这些类别的正确位置,这些类别位于category_location字段的category_table中。

我如何有效地执行这个查询?
上面,我提到了我所拥有的变量:$user_input(我们在stuff_vendor_name字段中搜索的不同匹配的值)和$current_location.

为了理解这些表的关系,我将使用一个示例。stuff_table有几十个条目,有几十个供应商,但是lookup_type为"西瓜"、"苹果"或"樱桃"。lookup_table将给出"Jellybean"的类别类型。一个类别类型可以有多个lookup_type。但是每个lookup_type只有一个category_type。

你没有分享太多的关系,但试试这个:

   SELECT *
     FROM stuff_table st
LEFT JOIN lookup_table lt
       ON st.lookup_type = lt.lookup_type
LEFT JOIN category_table ct
       ON lt.category_type = ct.category_type
      AND ct.category_location = $this_location
 GROUP BY st.lookup_type
 ORDER BY lt.lookup_quantity
    WHERE st.stuff_vendor_name = $user_input

乍一看,你可以在表中使用外键来建立它们之间的链接,或者使用LEFT JOIN mysql命令来抽象另一个链接表。

我能想到的唯一的例子是一个原则模式,但我想你会明白我在说什么:

$q = Doctrine_Query::create()
->from('Default_Model_DbTable_StuffTable s')
->leftJoin('s.LookupTable l')
->leftJoin('s.CategoryTable c')
->orderBy('l.lookup_quantity DESC');
$stuff= $q->execute(array(), Doctrine_Core::HYDRATE_ARRAY);

我用嵌套查询代替。

最终代码看起来像这样:

$query_row=mysql_query(
"SELECT DISTINCT * FROM table_a WHERE 
field_1 IN (SELECT field_1 FROM table_b WHERE field_2 = $field_2) 
AND field_3 IN (SELECT field_3 FROM table_c WHERE field_4 = $field_4)
ORDER BY field_5 DESC
");

这非常简单。我只是不知道你可以这样嵌套查询。

我读到它是"糟糕的形式",因为它使某种搜索优化没有达到应有的效果,所以要小心使用嵌套的选择语句。