我正在尝试从2个表中选择列
INNER JOIN
条件为$table1.idaction_url=$table2.idaction
和$table1.idaction_name=$table2.idaction
。
但是,从下面的查询中,没有输出。似乎INNER JOIN只能采取1个条件。如果我将AND
包含在下面的查询中所示的两个条件中,那么就不会有任何输出。请看下面的图片。请指教。
$mysql=("SELECT conv(hex($table1.idvisitor), 16, 10) as visitorId,
$table1.server_time, $table1.idaction_url,
$table1.time_spent_ref_action,$table2.name,
$table2.type, $table1.idaction_name, $table2.idaction
FROM $table1
INNER JOIN $table2
ON $table1.idaction_url=$table2.idaction
AND $table1.idaction_name=$table2.idaction
WHERE conv(hex(idvisitor), 16, 10)='".$id."'
ORDER BY server_time DESC");
答案 0 :(得分:0)
INNER JOIN
不对其可能具有的条件数量施加任何限制。
零结果行意味着没有行同时满足这两个条件。
确保使用正确的列加入。尝试一步一步地确定数据丢失的位置
答案 1 :(得分:0)
简答:
您需要使用两个单独的内部联接,而不仅仅是一个联接。
E.g。
SELECT `actionurls`.`name` AS `actionUrl`, `actionnames`.`name` AS `actionName`
FROM `table1`
INNER JOIN `table2` AS `actionurls` ON `table1`.`idaction_url` = `actionurls`.`idaction`
INNER JOIN `table2` AS `actionnames` ON `table1`.`idaction_name` = `actionurls`.`idaction`
(使用您要选择的任何其他字段修改此查询)。
深度:INNER JOIN
,当对第二个表唯一的值(在此操作中连接到第一个表的表)完成时,只会获取一行。你想要做的是从另一个表中获取数据两次,到同一行,读取语句的select部分。
INNER JOIN table2 ON [comparison]
中选择的每一行, table1
将抓取table2
[comparison]
为TRUE
的所有行,然后从{复制{ {1}} N 次,其中 N 是table1
中找到的行数。如果 N = 0 ,则跳过该行。在我们的案例中, N = 1 ,table2
中INNER JOIN
idaction_name
table1
idaction
table2
中的INNER JOIN
例如table2.name
将允许您选择所有动作名称。
为了获得动作网址,我们必须第二次+-----+------------------------+-------------------------+
| Row | actionUrl | actionName |
+-----+------------------------+-------------------------+
| 1 | unx.co.jp/ | UNIX | Kumamoto Home |
| 2 | unx.co.jp/profile.html | UNIX | Kumamoto Profile |
| ... | ... | ... |
+-----+------------------------+-------------------------+
。现在,您无法正常连接同一个表两次,因为当您在查询的第一部分中键入OR
时,SQL无法知道这两个连接表中的哪一个。如果两者具有相同的名称,则这将是不明确的。有一个解决方案,table aliases。
输出(我上面的答案)将是:
+-----+-------------------------+
| Row | actionUrl |
+-----+-------------------------+
| 1 | unx.co.jp/ |
| 2 | UNIX | Kumamoto Home |
| 3 | unx.co.jp/profile.html |
| 4 | UNIX | Kumamoto Profile |
| ... | ... |
+-----+-------------------------+
如果您只使用一个连接,那么您将获得此类输出(使用AND
):
idaction_name == idaction_url
使用TRUE
和单个联接,只有在$table1
为public static function boot()
{
parent::boot();
static::created(function ($user) {
$project = new Project();
$project->title = trans('messages.first_project');
$project->owner_id = $user->id;
$project->save();
$project->users()->attach([$user->id]);
});
}
时才会输出。事实并非如此,因此没有输出。
如果您想了解有关如何使用JOINS的更多信息,请参阅manual有关它们的信息。
<强>旁注强>
另外,我无法帮助您注意您使用存储表名称的变量(例如public function my_account(){
header("Access-Control-Allow-Origin: *");
header("Access-Control-Allow-Methods: PUT, GET, POST");
header("Access-Control-Allow-Headers: Origin, X-Requested-With, Content-Type, Accept");
$email_posted = $this->input->post('email');
$email = preg_replace('/\s+/', '', $email_posted);
$where = "email='$email'";
$this->db->where($where);
$query = $this->db->get('users');
$json = array();
if ($query->num_rows() > 0)
{
foreach ($query->result() as $row)
{
array_push($json,array("id"=>$row->id, "email"=>$row->email,"names"=>$row->names,"country"=>$row->country,"password"=>$row->password,"telephone"=>$row->telephone));
echo json_encode($json);
}
}
}
)。您确定这些值不包含用户输入吗?并且,如果他们这样做,您至少是否将用户可以访问的表列表列入白名单?您可能会遇到一些安全问题。