我讨厌提交一个新问题,但是其他所有人都有一些不同的东西,足以使这个问题变得有必要。
用户要输入供应商名称,然后在列表中查看他们从该公司购买的所有“种类”物品,按手头最低库存排序。
要点: 我有三张桌子 有更多的字段,但这些是相关的(据我所知)。
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。
答案 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语句。
然而对我来说,它似乎实际上要快得多。