0

exp 表:这是我存储条目的地方,同时将域和子域保存在单独的表中。该列可以有一个或多个与 中的列sub_domain匹配的 id 。idmisc

+----+---------+-----------+------------+-----------+--------+-------------+------------+------------+
| id | user_id | job_type  | experience | exp_title | domain | sub_domain  | start      | end        |
+----+---------+-----------+------------+-----------+--------+-------------+------------+------------+
| 83 |     268 | Full Time | dasdfg     | dest      | 76     | 89,91,93,95 | 07/15/2012 | 07/31/2012 |
| 84 |     269 | Full Time | abcdef     | title     | 77     | 89          | 07/15/2011 | 07/31/2011 |
+----+---------+-----------+------------+-----------+--------+-------------+------------+------------+

杂项表:

+-----+----------------------------------------+--------------+
| id  | name                                   | category     |
+-----+----------------------------------------+--------------+
|  89 | Name1                                   | category    |
|  91 | Name2                                   | category    |
|  93 | Name3                                   | category    |
|  95 | Name4                                   | category    |
|  55 | Name5                                   | category    |

LEFT JOIN misc c ON a.sub_domain=c.id我想知道如果 exp 表中有多个 sub_domains 时如何更改,同时记住也可以有一个 id。

$query_str = "SELECT a.*, b.name, c.name AS sub_name
            FROM exp a 
            LEFT JOIN misc b ON a.domain=b.id
            LEFT JOIN misc c ON a.sub_domain=c.id
            WHERE a.user_id = ?";
4

3 回答 3

0

试试这个

$query_str = 
    "SELECT a.*, b.name, c.name AS sub_name 
    FROM exp a  
    LEFT JOIN misc b ON a.domain=b.id 
    LEFT JOIN misc c ON locate(concat('','',c.id ,'',''),'','',a.sub_domain,'','') >0
    WHERE a.user_id = ?"; 
于 2012-07-20T10:21:46.167 回答
0

您必须在两个查询中执行此操作。主要原因之一是,如果您设法完成您想做的事情,您将返回除sub_name列之外具有几乎相同数据的行。这真的是不必要的。

您可以首先JOIN打开这两个表a.domain = b.id,然后构造第二个查询,该查询IN(...)对所有子域值使用一条语句。它会是这样的:

$subdomains = explode(',', $data_from_first_query['sub_domain']);
if (count($subdomains)) {
  $q2 = '
    SELECT
      b.name
    FROM 
      misc AS b 
    WHERE b.id IN ('.implode(',',array_fill(0, count($subdomains), '?')).')';
}

然后使用 foreach 在占位符中绑定值。

但话又说回来,确保您的数据库已规范化是一种很好的做法。

于 2012-07-20T10:33:21.370 回答
0

使用逗号分隔值的列是不好的。阅读问题的答案:

在数据库列中存储逗号分隔列表真的那么糟糕吗?

简短的回答是:这真的很糟糕。


在您修复设计之前,您可以使用以下FIND_IN_SET()功能:

$query_str = "
        SELECT a.*, b.name, c.name AS sub_name
        FROM exp a 
          LEFT JOIN misc b ON a.domain = b.id
          LEFT JOIN misc c ON FIND_IN_SET(c.id, a.sub_domain) 
         WHERE a.user_id = ?
             ";
于 2012-07-20T11:10:57.983 回答