相同的2个表之间有2个内连接

时间:2017-09-04 06:49:20

标签: mysql sql

我正在尝试从2个表中选择列

INNER JOIN条件为$table1.idaction_url=$table2.idaction$table1.idaction_name=$table2.idaction

但是,从下面的查询中,没有输出。似乎INNER JOIN只能采取1个条件。如果我将AND包含在下面的查询中所示的两个条件中,那么就不会有任何输出。请看下面的图片。请指教。

enter image description here

 $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");

2 个答案:

答案 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 table2INNER 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和单个联接,只有在$table1public 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); } } } )。您确定这些值不包含用户输入吗?并且,如果他们这样做,您至少是否将用户可以访问的表列表列入白名单?您可能会遇到一些安全问题。