使用PHP,如何在这三个表中查询此mySQL数据库?

时间:2011-09-09 19:27:30

标签: php mysql join

我讨厌提交一个新问题,但是其他所有人都有一些不同的东西,足以使这个问题变得有必要。

用户要输入供应商名称,然后在列表中查看他们从该公司购买的所有“种类”物品,按手头最低库存排序。

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

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

lookup_table
lookup_type
lookup_quantity (按此顺序)
category_type

category_table
category_type
category_location(检查此字段== $ this_location,已分配)

Wordier说明: 用户正在搜索仅包含在stuff_table中的值 - 每个lookup_type的distinct stuff_vendor_name值。每件商品都可以从多个来源购买,其目的是看看是否有任何供应商以前曾经销售过任何类型的商品。

但结果需要在lookup_table中的lookup_quantity ORDER BY。

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

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

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

3 个答案:

答案 0 :(得分:0)

你没有太多关于这种关系,但试试这个:

   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

答案 1 :(得分:0)

乍一看,您可以在表中使用外键来建立它们之间的链接,或者使用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);

答案 2 :(得分:0)

我做了一个嵌套查询。

最终代码如下:

$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
");

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

我认为它是“糟糕的形式”,因为它使某种搜索优化不尽如人意,所以要小心使用嵌套的select语句。

然而对我来说,它似乎实际上要快得多。