Php 如何联接所有表?
我是一个新的程序员,我不知道如何做到这一点 我有:Php 如何联接所有表?,php,mysql,sql,join,relationship,Php,Mysql,Sql,Join,Relationship,我是一个新的程序员,我不知道如何做到这一点 我有: 名为customers(cust\u id,name)的表 名为agents(agent\u id,agent\u name)的表 名为authorizations(客户id、代理id)的表 名为产品服务的表(p\U s\U id、客户id、代理id、项目名称、项目id) 关于授权表:代理id是客户id的授权销售人员的代理。因此,我需要能够在这个代理id下,仅提取这个特定客户id的结果 我需要做一个查询,返回客户在所有其他代理下拥有的所有产
- 名为
(cust\u id,name)的表customers
- 名为
(agent\u id,agent\u name)的表agents
- 名为
(客户id、代理id)的表authorizations
- 名为
产品服务
的表(p\U s\U id、客户id、代理id、项目名称、项目id)
授权
表:代理id
是客户id
的授权销售人员的代理。因此,我需要能够在这个代理id
下,仅提取这个特定客户id
的结果
我需要做一个查询,返回客户在所有其他代理下拥有的所有产品和服务。在搜索中,它还应该返回他们在我项下拥有的产品/服务
这就是我迄今为止所尝试的:
$sql = "SELECT
product_services.item_name, agents.agent_name,
customers.name, agents.agent_id, product_services.item_id
FROM
product_services
LEFT JOIN agents ON product_services.agent_id = agents.agent_id
LEFT JOIN customers ON product_services.cust_id = customers.cust_id
WHERE authorizations.agent_id = '$aid'
AND product_services.item_name LIKE '%$q%'
ORDER BY product_services.id DESC
LIMIT $start, $limit";
KPO
下面是我用来连接两个表的查询。这与查询相同,请注意从“LEFT JOIN”开始使用的语法
考虑到您的SQL查询最初是正确的,这应该适用于您的左连接部分:
LEFT JOIN(agents, customers
)ON( product_services.agent_id = agents.agent_id
AND product_services.cust_id = customers.cust_id)
通常,查询将以位于条件根的核心表开始。。。例如,一个单一的客户和加入从那。。。您还声明希望所有代理(包括“me”代理)提供所有产品/服务,您不希望在“$aid”标准上设置过滤器
SELECT STRAIGHT_JOIN
c.cust_id,
c.name,
ag.agent_id,
ag.agent_name,
ps.item_name,
ps.p_s_id,
ps.item_id
from
customers c
join authorizations au
on c.cust_id = au.cust_id
[[ AND au.agent_id = '$aid' ]]
join agents ag
on au.agent_id = ag.agent_id
join product_services ps
on c.cust_id = ps.cust_id
AND au.agent_id = ps.agent_id
[[ AND ps.item_name like '%$q%' ]]
order by
ps.p_s_id DESC
limit
$start, $limit
在上面的查询中,我在一节中列出了您可以应用
[[ AND agent criteria ]]
或产品/服务标准。但正如你所说的,你想要所有特工的所有活动,所以我把它漏掉了。。。同样地,以一种可能的方式
[[ AND product / service ]]
可能/可能未提供的标准,您可以非常简单地将其删除
--按评论编辑反馈
根据您关于如何添加更多“标准”的询问,其依据是表格的来源。如果它是“FROM”子句中的第一个表,您将添加一个WHERE子句并将条件放入该表中。。。至于其他的,比如代理和产品服务,我有[[criteria]],你可以在那里扩展你的全部标准(根据它所连接的相应表)
例如您的[[产品服务标准]],我可以添加如下内容
AND ( ( ps.Item like '%$something'
OR ps.Item like '%$another'
OR ps.Item like '%$more' )
AND ps.OtherField = whatever )
保留主要的“连接”条件,这些条件首先确定表之间的关系。。。只有这样,您才想添加限制条件。。。正如您在上面的示例中所看到的,我将整个AND()子句包装在括号中,将其视为单个“unit”条件。。。例如到产品/服务表
希望此示例对您将来的查询有所帮助。对于与数据库相关的问题,这是一个很好的形式来说明您正在使用的数据库。从语法上看,它看起来像mysql到mesorry!我使用的是phpmyadmin。yes123的意思是,“phpmyadmin”是一个管理界面,而不是一个数据库。我猜你正在使用MySQL:)我仍然遇到同样的问题。问题是它向我显示了不在我之下的客户的结果。你的客户在ID之外是如何分开的?他们是按你的名字分组的吗?用户名?等等?用户名也包含在代理和客户表中。不知道为什么我没有在我的问题中包括这一点,如果您的表列像我的示例中那样是“username”,并说您的username是KPO。那么WHERE子句应该是:WHERE username='KPO';成功了!但是,我如何添加更多类似的想法;e、 例如“%$q%”之类的。谢谢Drapp,我似乎在这里创建了一个非常复杂的查询。由于某种原因,like函数不能正常工作。这是我夜间工作的时间。当我回来的时候,我会再次关注它。谢谢你的帮助,请留意我的更新谢谢@DRapp搜索的问题来自“AND au.agent_id=ps.agent_id”当我移除该约束时,搜索工作正常,但每个结果显示两次。。。不知道该怎么做来解决这个问题..在表名之后使用“au”“c”是否也很重要?@KPO。。。表名后面的“au”、“c”和“ps”用作表的“别名”。。。就像一条捷径。。。如果您正在执行长查询并且具有长表名,则可以对查询的其余部分(包括列名、联接等)应用“别名”,而不是重复键入长名称并出现键入错误(oops因素):)
AND ( ( ps.Item like '%$something'
OR ps.Item like '%$another'
OR ps.Item like '%$more' )
AND ps.OtherField = whatever )