我有3张桌子,
user - contains user_id | username | fullname | email etcc
user_profile - contains entry_id |user_id| profile_image_id| user_location etcc
user_profile_images - contains image_id| user_id | file_path | file_thumb | date etcc
当用户签名时,所有详细信息都会转到users表,user_id也会添加到user_profile表中,其余的默认设置为NULL,直到用户添加一些个人资料信息。
我在model_users中有一个查询来从这三个表中获取所有用户的数据,它就像这样;
$this->db->where('users.user_id', $user_id)->select('*')->from('users');
$this->db->join('user_profile', 'user_profile.user_id = users.user_id', 'left');
$this->db->join('user_profile_images','user_profile_images.image_id = user_profile.profile_image_id','left');
只有当user_profile中的profile_image_id字段不为null时,即用户上传了pic时,它才能正常工作。如果该字段为null,则即使返回所有其他数据,也不会返回用户user_id。
我可以看到为什么会出现这种情况,因为我的连接查询需要字段profile_image_id,但目前我的方法是将user_profile中的profile_image_id设置为1(默认值),这是默认图像,其image_id为1,user_id为0,因为它是一般的默认图像。但我仍然无法克服这样一个事实,即我需要更新该查询,以减少黑客攻击。 你们有什么想法吗?
答案 0 :(得分:4)
尝试
$this->db->select('*')->select('users.user_id')->from('users')
->join('user_profile', 'user_profile.user_id = users.user_id', 'LEFT')
->join('user_profile_images', 'user_profile_images.image_id = user_profile.profile_image_id', 'LEFT')
->group_by('users.user_id')
->where('users.user_id', $user_id);
$query = $this->db->get();
答案 1 :(得分:1)
对表使用join时,您需要所有连接表中的列具有唯一名称。您可以通过AS语法添加列别名,也可以只检索所需的列。在您的情况下,错误很可能是由于所有三个表中都存在user_id
。因此,结果就像你经历的那样。仅在最后一次出现时检索user_id
,即如果您的用户上传了图片。我会改变查询,如:
$this->db->where('users.user_id', $user_id);
$this->db->select('users.*,user_profile.user_location,user_profile_images.filepath'); // and other fields of interest...
$this->db->from('users');
$this->db->group_by('users.user_id'); // very useful for not getting multiple rows/user
$this->db->join('user_profile', 'user_profile.user_id = users.user_id', 'left');
$this->db->join('user_profile_images','user_profile_images.image_id = user_profile.profile_image_id','left');
答案 2 :(得分:0)
试试这个。
$this->db->select("*");
$this->db->from('table1');
$this->db->join('table2','table2.id1=table1.id1');
$this->db->join('table3','table3.id1=table1.id1');
$query = $this->db->get();
return $query->result();