我正在构建一个Web应用程序,并选择在我的应用程序中使用类似的表和字段名称到Wordpress。我的意思是我有一个用户表和一个类似于Wordpress工作方式的usermeta表。
原谅我让这个问题变得如此之大,我选择在这个问题上尽可能具有描述性。
usermeta表具有以下表值;
umeta_id
USER_ID
meta_key
meta_val
作为一个例子,我在usermeta表中有以下数据;
user_id = 1
meta_key = first_name
meta_value ='dwayne
user_id = 1
meta_key = last_name
meta_value = charrington
在我的用户表中,我有以下示例数据;
ID = 1
user_login = admin
user_pass = ui3h423h4o82374
user_email = test@test.com
基本上我想要做的是使用以下连接,这似乎有点工作,有点:
$db = $this->db;
$db->select('wolf_users.ID, wolf_usermeta.user_id AS ID', FALSE);
$db->select('wolf_users.user_login AS user_login', FALSE);
$db->select('wolf_users.user_email AS user_email', FALSE);
$db->select('wolf_users.user_status AS status', FALSE);
$db->select('wolf_usermeta.meta_key AS meta_key', FALSE);
$db->select('wolf_usermeta.meta_value AS meta_value', FALSE);
$db->from('wolf_users');
$db->join('wolf_usermeta', 'wolf_users.ID = wolf_usermeta.user_id', 'left');
$db->where('wolf_usermeta.user_id = wolf_users.ID');
$q = $db->get();
return $q->result_array();
首先:result_array似乎是从我的数据库中返回重复数据(这有点奇怪)我是否错误地格式化了我的连接,或者是否有一些我缺少的东西来防止这种情况?仅使用$ q-> result()返回结果似乎会停止返回重复数据。
我正在使用Dwoo进行模板化,当我使用print_r回显出保存数据的变量时,它在使用查询时没有显示重复的查询内容,但在使用result_array时显示重复的内容(几乎就像在usermeta表上循环一样)几次)。
我使用此数据库查询的其中一个页面是一个页面,列出数据库中的所有客户端,然后从usermeta表中提取匹配的数据。所以我的问题是如何从两个表中访问数据,然后在我的视图模板中使用foreach在我的应用程序中显示它?
答案 0 :(得分:2)
您了解联接的工作原理吗?
通过将元数据加入用户,将为您提取的每个元数据条目重复用户。
将数据从数据库中拉出或将查询拆分为两个查询后,可以使用foreach来避免这种情况。
$user = $this->db
->select('ID, user_login, user_email, user_status AS status')
->where('ID', $id)
->get('wolf_users')
->row_array();
if(!$user)
{
return FALSE;
}
$user['meta'] = $this->db
->select('meta_key, meta_value')
->where('user_id', $id)
->get('wolf_usermeta')
->result_array();
return $user;
一些常见的MySQL要点和提示:
wolf_users.ID, wolf_usermeta.user_id AS ID
不需要,您只需要选择一次用户ID。第二个选择将覆盖第一个,当然是相同的。
$db->select('wolf_usermeta.meta_value AS meta_value', FALSE);
您不需要这样做,表名将从结果中删除,因此重命名它们毫无意义。
祝你好运!答案 1 :(得分:0)
根据您的样本数据,您可能会出现两行;我不知道这是不是“重复数据”的意思。这些行的不同之处在于它们对meta_key和meta_value具有不同的值。
如果行在这些列中显示的值相同,请检查user_meta表或用户表以检查其中任何一行中是否存在重复行。您的表上是否有唯一的键约束?
我看不到你指定的where子句会影响查询,因为它与连接条件相同。
答案 2 :(得分:0)
我检查了两个数据库表,并且在任一个表中都没有找到重复的行。我删除了where子句,因为我注意到无论如何连接都有效地完成了同样的事情,并且将它放在那里是多余的。
我无法理解这里发生了什么。从我所看到的,我已经在我的连接中完成了所有操作,并且应该没有理由在查询输出中多次显示行(尽管数据库中没有重复的行)。是否有更好的方法可以构建我的表格以使自己更容易?
我正在构建的应用程序需要某种自定义字段功能,例如我当前的usermeta表允许我在单独的表中执行以保持一切清洁和分离。
我也没有唯一的键约束,可以将字段设置为唯一键导致问题吗?我正在考虑让我的user_login(用户名字段)成为一个唯一的密钥,以防止重复的名称。