从两个表中选择而不重复所有值

时间:2016-11-15 22:55:56

标签: php mysql pdo

让我自己澄清一下,我的问题是"如何从绑定单个表和交叉引用表中选择行而不重复值?"

现在我有三个表,一个交叉引用表和两个单表:

           Table jobs
╔══════════╦══════════════════════════╗
║ job_id   ║  details                 ║
╠══════════╬══════════════════════════╣
║  1       ║  Looking for hire...     ║
║  2       ║  We need help!...        ║
║  3       ║  We are a store that...  ║
║  4       ║  Help wanted...          ║
╚══════════╩══════════════════════════╝

      Table job2pos
╔═══════════╦═════════════╗
║  job_id   ║ position_id ║
╠═══════════╬═════════════╣
║  1        ║  10         ║
║  2        ║  10         ║
║  2        ║  12         ║
║  3        ║  11         ║
║  3        ║  13         ║
║  4        ║  10         ║
╚═══════════╩═════════════╝

        Table positions
╔═══════════════╦═══════════════╗
║ position_id   ║ position_name ║
╠═══════════════╬═══════════════╣
║  10           ║  waitress     ║
║  11           ║  cashier      ║
║  12           ║  cook         ║
║  13           ║  chef         ║
╚═══════════════╩═══════════════╝

执行此查询时:

$sql = "SELECT jobs.details, positions.name AS position FROM jobs
INNER JOIN job2pos ON jobs.job_id = job2pos.job_id
INNER JOIN positions ON job2pos.position_id = positions.position_id
WHERE job2pos.job_id IN (2)";
...
print_r($stmt->fetchAll(\PDO::FETCH_ASSOC));

我得到以下内容:

Array(
  [0] => Array ([details] => We need help!...
                [position] => Waitress)
  [1] => Array ([details] => We need help!...
                [position] => Cook)
)

现在我为同一份工作获得了2行,但我想要的是类似的东西:

Array(
  [0] => Array ([details] => We need help!...
                [position] => Array ([0] => Waitress
                                     [1] => Cook)
               )
)
  • 如果你能在我的代码中指出一些不必要的代码,那就太棒了。

1 个答案:

答案 0 :(得分:1)

您只能使用一个sql语句来描述所描述的内容。你可以把结果想象成一张桌子。您不能在普通的SQL中拥有任何嵌套信息。

我们可以选择nosql个数据库来存储和检索对象。

但是,我认为您真正想要的是选择multiple statements with one call

来自mysqli documentation

  

MySQL可选择允许在一个语句中包含多个语句   串。一次发送多个语句会减少客户端 - 服务器   往返但需要特殊处理。

     

必须执行多个语句或多个查询   mysqli_multi_query()。声明的个别陈述   字符串用分号分隔。然后,返回所有结果集   必须提取已执行的语句。

     

MySQL服务器允许具有返回结果集的语句   和不返回一个倍数的结果集的语句   言。

来自this Q&A的PDO:

$stmt   = $db->query("SELECT 1; SELECT 2;");
$stmt->nextRowset(); //Move to next statement result
var_dump( $stmt->fetchAll(PDO::FETCH_ASSOC) ); //SELCT 2 result