如何加入所有表格?

时间:2011-06-07 21:48:36

标签: php mysql sql join relationship

我是一名新程序员,我不知道该怎么做。

我有:

  • 名为customers(cust_id,name)
  • 的表
  • 名为agents(agent_id,agent_name)
  • 的表格
  • 名为authorizations的表(cust_id,agent_id)
  • 名为product_services的表(p_s_id,cust_id,agent_id,item_name,item_id)

关于authorizations表格:agent_idcust_id授权销售人员的代理商。因此,我需要能够在此cust_id下仅为此特定agent_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";

2 个答案:

答案 0 :(得分:1)

KPO,

下面是我用来连接2个表的查询。对于您的查询,它将是相同的,请注意从“LEFT JOIN”开始使用的语法

    SELECT 
    user.username,
    groups.group_id, groups.group_name,  
    sign.last_connected, sign.sign_id, sign.sign_name, sign.resolution_x, sign.resolution_y, LEFT(sign.sign_name, 1) AS first_char
FROM
    user
LEFT JOIN(
    groups, sign
)ON(
    user.user_id = groups.userID AND
    groups.group_id = sign.groupID
)
WHERE
    username = ? AND
    UPPER(sign.sign_name) BETWEEN "A" AND "Z"
    OR sign.sign_name BETWEEN "0" AND "9" ORDER BY sign.sign_name

考虑到您的SQL查询最初是正确的,这应该适用于您的LEFT JOIN部分:

LEFT JOIN(agents, customers
)ON( product_services.agent_id = agents.agent_id 
AND product_services.cust_id = customers.cust_id) 

答案 1 :(得分:1)

通常情况下,查询将从您的标准根目录的核心表开始...例如单个客户并从中加入...您还声明您希望所有代理商的所有产品/服务,包括“我“代理商,您不希望对'$ 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”子句中的FIRST表,你将添加一个WHERE子句并将标准放到该表中......对于其他人,如代理和产品服务,我有[[criteria]],你可以在那里扩展你的整个标准(每个表加入其中)。

例如您的[[产品服务条件]],我可以添加类似

的内容
AND (   (   ps.Item like '%$something'
         OR ps.Item like '%$another'
         OR ps.Item like '%$more' )
     AND ps.OtherField = whatever )

保持您的主要“加入”条件,首先确定表格之间的关系...只有那么您是否要添加限制标准...正如您在上面的示例中所看到的,我已经包装了括号内的整个AND()子句将其视为单个“单元”条件...例如产品/服务表。

希望此示例可以帮助您将来查询。