让我自己澄清一下,我的问题是"如何从绑定单个表和交叉引用表中选择行而不重复值?"
现在我有三个表,一个交叉引用表和两个单表:
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)
)
)
答案 0 :(得分:1)
您只能使用一个sql语句来描述所描述的内容。你可以把结果想象成一张桌子。您不能在普通的SQL中拥有任何嵌套信息。
我们可以选择nosql个数据库来存储和检索对象。
但是,我认为您真正想要的是选择multiple statements with one call
。
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