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

使用PHP,如何跨这三个表查询mySQL数据库?,php,mysql,join,Php,Mysql,Join,我不想提出一个新问题,但其他人都有一些细微的不同,足以让这个问题看起来有必要提出 用户需要输入一个供应商名称,然后在一个列表中查看他们从该公司购买的所有物品,并按手头最低库存进行排序 总结: 我有三张桌子。 还有更多的领域,但据我所知,这些是相关的领域 桌子上的东西 stuff_vendor_name*使用$user_input搜索此字段,但每个查找类型只搜索一个结果* 查找类型 查找表 查找类型 按此查询数量订单 类别类型 类别表 类别类型 类别位置检查此字段是否=$此位置(已分配) 更详细的

我不想提出一个新问题,但其他人都有一些细微的不同,足以让这个问题看起来有必要提出

用户需要输入一个供应商名称,然后在一个列表中查看他们从该公司购买的所有物品,并按手头最低库存进行排序

总结: 我有三张桌子。 还有更多的领域,但据我所知,这些是相关的领域

桌子上的东西 stuff_vendor_name*使用$user_input搜索此字段,但每个查找类型只搜索一个结果* 查找类型

查找表 查找类型 按此查询数量订单 类别类型

类别表 类别类型 类别位置检查此字段是否=$此位置(已分配)

更详细的解释: 用户正在搜索仅包含在stuff_表中的值-每个查找类型的不同stuff_供应商_名称值。每件商品都可以从多个渠道购买,目的是看看是否有供应商曾经出售过任何一种商品

但是,在lookup_表中,结果需要按lookup_数量排序

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

如何有效地进行此查询? 上面,我提到了我拥有的变量: $user\u输入我们正在stuff\u vendor\u name字段和$current\u location中搜索的不同匹配项的值

为了理解这些表之间的关系,我将使用一个示例。 stuff_表有几十个供应商的条目,但有一个查找类型,比如西瓜、苹果或樱桃。
lookup_表将给出Jellybean的category_类型。一个类别类型可以有多个查找类型。但是每个查找类型都只有一个类别类型。

您没有分享太多关于关系的信息,但请尝试以下方法:

挑选* 从stuff_table st 左联接查找表lt 在st.lookup\u type=lt.lookup\u type上 左联接类别表ct 在lt.category\u type=ct.category\u type上 和ct.category_location=$this_location 按st.U类型分组 按lt.U数量订购 其中st.stuff\u vendor\u name=$user\u 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
");
这是难以置信的简单。我只是不知道你可以做这样的嵌套查询

我读到它是一种糟糕的形式,因为它使某种搜索优化不如它可能的好,所以使用嵌套select语句时要小心


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

一个类别类型有多个查找类型。查找类型始终只有一个类别类型。例如,查找类型可能是橙色、草莓色或苹果色,但这三种查找类型都有一个类别类型jellybean。@Jerry Rowe:类别类型可以没有查找类型吗?查找类型是否可以没有类别类型?是的,类别类型可以为空,因此没有查找类型,但在这种情况下不会对其进行搜索。但每种查找类型都有一个类别_type@Jerry:好的,如果是这样的话,左连接就可以了。唯一的问题是,如果stuff总是有一个lookup_类型,那么将第一个左JOIN子句更改为一个内部JOIN,您就可以开始了。我会尽快将此作为我自己的答案发布。我不知道为什么没有更广泛地讨论这个问题。这是一个内部连接,如果表中至少包含一个引用记录,那么它就可以工作,否则左连接就可以了。