我讨厌提交一个新问题,但是每个人都有一些细微的不同,足以使这个问题看起来有必要问。
用户输入一个供应商的名字,然后在一个列表中看到他们从该公司购买的所有"种类"的东西,按库存最低排序。
简介:我有三张桌子。
还有比这些更多的字段,但这些是相关的(据我所知)。
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
");
这非常简单。我只是不知道你可以这样嵌套查询。
我读到它是"糟糕的形式",因为它使某种搜索优化没有达到应有的效果,所以要小心使用嵌套的选择语句。