【问题标题】:How to join all tables?如何连接所有表?
【发布时间】:2011-06-07 21:48:36
【问题描述】:

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

我有:

  • 名为customers(cust_id,名称)的表
  • 一个名为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 的授权销售人员的代理。因此,我需要能够在此agent_id 下仅提取此特定cust_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";

【问题讨论】:

  • 对于 db 相关的问题,最好提一下您使用的数据库。
  • 从语法上看,我觉得是mysql
  • 对不起!我正在使用 phpmyadmin。
  • yes123 的意思是,'phpmyadmin' 是一个管理界面,而不是一个数据库。我猜你当时正在使用 MySQL :)

标签: php mysql sql join relationship


【解决方案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) 

【讨论】:

  • 我仍然遇到同样的问题。
  • 问题是它向我展示了不属于我的客户的结果。
  • 您的客户在 ID 之外是如何分开的?他们是按你的名字分组的吗?用户名?等等?
  • 用户名也包含在代理和客户表中。不知道为什么我没有在我的问题中包含这个
  • 如果您的表格列是“用户名”,就像我的示例中一样,并说您的用户名是 KPO。那么 WHERE 子句将是:WHERE username = 'KPO';
【解决方案2】:

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

例如您的 [[ 产品服务标准 ]],我可以添加类似的内容

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

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

希望此示例对您将来的查询有所帮助。

【讨论】:

  • 成功了!但是我如何为 LIKE 添加更多想法;例如 OR something.something LIKE '%$q%' OR something.that LIKE '%$q%'
  • 谢谢 Drapp 好像我在这里创建了一个非常复杂的查询。由于某种原因,like 功能无法正常工作。它适合我的夜间工作。当我回来时,我会再次专注于它。感谢您的帮助并留意我的更新谢谢!!
  • @DRapp 搜索问题来自“AND au.agent_id = ps.agent_id”,当我删除该约束时,搜索工作正常,但每个结果显示两次......不知道该怎么做解决这个问题..
  • 在表名之后使用“au”“c”也很重要吗?
  • @KPO...我在表名之后的“au”、“c”和“ps”用作表的“别名”...就像一个快捷方式...如果您正在执行长查询并且具有长表名,您可以为查询的其余部分应用“别名”,包括列名、连接等,而不是重复输入长名称并出现输入错误(糟糕因素):)
猜你喜欢
  • 1970-01-01
  • 2011-04-25
  • 2016-11-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多