我有一个服务器端数据表,它从名为 leads
的表中获取一些结果。
在此线索表中,我有一个名为 permission
的列,它是 json_encoded;
示例:{"13":["view"]}
数字“13”与我的accounts
表中的 user_id 相关联。
搜索正在处理所有其他字符串字段,因此我决定制作某种 JOIN 语句,以便我也可以将该字段作为字符串读取。
当我意识到我无法真正将 JSON 数据处理为简单的 ID 来创建 JOIN 语句时,我陷入了困境。 因此,类似:
if (!empty($this->db->field_exists('permission', $this->table))) {
$this->db->join("accounts AS t2", "t2.user_id = leads.permission");
}
不起作用,因为t2.user_id
确实是一个数字,但leads.permission
将是json编码的字符串
如果您需要更多信息,我很乐意编辑我的帖子。
谢谢!
不明确的错误
SELECT `tbl_leads`.`email` as `email`, `tbl_leads`.`contact_name` as `contact_name`, `tbl_leads`.`phone` as `phone`, `tbl_leads`.`lead_status_id` as `lead_status_id`, `tbl_leads`.`permission` as `permission`, `tbl_leads`.`linkedin` as `linkedin`, `tbl_leads`.`leads_id` as `leads_id`, `tbl_leads`.`converted_client_id` as `converted_client_id`, `t2`.`username` as `namexx`
FROM `tbl_leads`
JOIN `tbl_users` AS `t2` ON `t2`.`user_id` = JSON_UNQUOTE(JSON_EXTRACT(JSON_KEYS(tbl_leads.permission), '$[0]'))
WHERE (
`lead_name` LIKE '%w%' ESCAPE '!'
OR `contact_name` LIKE '%w%' ESCAPE '!'
OR `email` LIKE '%w%' ESCAPE '!'
OR `phone` LIKE '%w%' ESCAPE '!'
OR `lead_status_id` LIKE '%w%' ESCAPE '!'
OR `permission` LIKE '%w%' ESCAPE '!'
OR `namexx` LIKE '%w%' ESCAPE '!'
OR `linkedin` LIKE '%w%' ESCAPE '!'
OR `leads_id` LIKE '%w%' ESCAPE '!'
)
AND `converted_client_id` = '0'
ORDER BY `leads_id` DESC
LIMIT 20
这是由创建的
if ($this->table == 'tbl_leads') {
// $this->db->join("tbl_users AS t2", "t2.user_id = tbl_leads.permission");
$this->db->select (
'tbl_leads.email as email,
tbl_leads.contact_name as contact_name,
tbl_leads.phone as phone,
tbl_leads.lead_status_id as lead_status_id,
tbl_leads.permission as permission,
tbl_leads.linkedin as linkedin,
tbl_leads.leads_id as leads_id,
tbl_leads.converted_client_id as converted_client_id,
t2.username as namexx');
$this->db->join("tbl_users AS t2", "t2.user_id = JSON_UNQUOTE(JSON_EXTRACT(JSON_KEYS(tbl_leads.permission), '$[0]'))");
}
$query = $this->db->get();
最佳答案
您可以结合使用MySQL JSON search functions :
if (!empty($this->db->field_exists('permission', $this->table))) {
$this->db->join("accounts AS t2", "t2.user_id = JSON_UNQUOTE(JSON_EXTRACT(JSON_KEYS(leads.permission), '$[0]'))");
}
首先 JSON_KEYS
将以数组格式字符串的形式返回 json 键,然后 JSON_EXTRACT
将其提取为字符串,最后 JSON_UNQUOTE
将删除引号。
关于php - CodeIgniter Datatable加入搜索(json_encoded数据),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56722837/