我正在构建一个web应用程序,并选择在我的应用程序中使用与Wordpress类似的表名和字段名。我的意思是,我有一个用户表和一个类似于Wordpress工作原理的用户表。
请原谅我把这个问题说得太大了,我在这个问题中选择了尽可能多的描述性。
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 =查林顿
在我的users表中,我有以下示例数据;
ID =1
user_login =管理员
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回显保存数据的变量时,它在使用query时不显示重复的查询内容,但在使用result_array时显示重复的内容(几乎就像它在usermeta表上循环了几次一样)。
我使用这个数据库查询的其中一个页面列出了数据库中的所有客户端,然后从usermeta表中获取匹配的数据。因此,我的问题是如何访问这两个表中的数据,然后使用foreach in my view模板在应用程序中显示这些数据?
发布于 2010-07-19 08:49:23
你知道joins是怎么工作的吧?
通过将元数据连接到用户,将对您拉出的每个元数据条目重复该用户。
这可以在从数据库中提取数据后使用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一次。第二个select将覆盖第一个select,后者当然是相同的。
$db->select('wolf_usermeta.meta_value AS meta_value', FALSE);
您不需要这样做,表名将从结果中删除,因此重命名它们是没有意义的。
祝好运!
发布于 2010-07-18 09:13:54
在给定样本数据的情况下,您可能希望出现两行;我不知道这是否是您所说的“重复数据”的意思。这些行应该不同,因为它们的meta_key和meta_value具有不同的值。
如果这些列中的行具有相同的值,那么您是否检查了user_meta表或user表,以检查这两个表中是否有重复的行。您的表是否具有唯一键约束?
我看不出您指定的where子句会影响查询,因为它与连接条件相同。
发布于 2010-07-18 23:55:57
我已经检查了两个数据库表,都没有找到重复的行。我删除了where子句,因为我注意到join实际上做了同样的事情,而且在那里使用它是多余的。
我不可能弄清楚这里发生了什么。从我所看到的情况来看,我在连接中做的一切都是正确的,并且没有理由在查询输出中多次显示行(尽管数据库中没有重复的行)。有没有一种更好的方法可以使我的表结构更容易呢?
我正在构建的应用程序需要某种类型的自定义字段功能,比如我当前的usermeta表,它允许我在一个单独的表中执行操作,以保持所有内容的整洁和分离。
我也没有唯一键约束,将一个字段设置为唯一键会导致问题吗?我在考虑让我的user_login (用户名字段)成为一个唯一的键,以防止重复的名字。
https://stackoverflow.com/questions/3274327
复制相似问题