gpt4 book ai didi

php - 如何在 SQL、Codeigniter 中的一个查询中设置不同的限制不同列?

转载 作者:行者123 更新时间:2023-11-29 10:02:31 25 4
gpt4 key购买 nike

我有一个数据表,我需要搜索结果按列名称显示

我有这张 table

id address        city      zipcode  state  country
1 12, street arizona 1234 abcd new island
2 abcd,stree abcd 7895 abcd us
3 new av mumbai 6875 abcd uk
4 abcd, street test ci 5687 abcd new island
5 6741, street df df 12345 abcd uae

如果有人搜索“abcd”,我需要什么,我希望结果像这样显示

5 个匹配“abcd”的地址

城市、邮政编码、州和国家各 1 个

所以基本上我希望在一个查询中限制地址获取 5 个地址,限制 1 个城市(如果可用),限制 1 个邮政编码(如果可用),限制 1 个州(如果可用),限制 1 个国家/地区(如果可用)。

关键字还应该查找每一列,而不仅仅是地址。我确实通过使用多个查询实现了这一点

 $query = $this->db->query("SELECT city FROM ".$this->db->dbprefix('prison')." WHERE city like'%".$keyword."%' LIMIT 1");
$query2 = $this->db->query("SELECT zipcode FROM ".$this->db->dbprefix('prison')." WHERE zipcode like'%".$keyword."%' LIMIT 1");
$query3 = $this->db->query("SELECT state FROM ".$this->db->dbprefix('prison')." WHERE state like'%".$keyword."%' LIMIT 1");
$query4 = $this->db->query("SELECT address FROM ".$this->db->dbprefix('prison')." WHERE address like'%".$keyword."%' LIMIT 10");
$query5 = $this->db->query("SELECT country FROM ".$this->db->dbprefix('prison')." WHERE country like'%".$keyword."%' LIMIT 1");

$result_array = [];
$result_array['cities'] = $query->row();
$result_array['zipcode'] = $query2->row();
$result_array['state'] = $query3->row();
$result_array['address'] = $query4->result();
$result_array['country'] = $query5->row();

return $result_array;

无论如何我可以在一个查询中实现这一目标吗?这个解决方案是否可行,我通过 ajax 在 keyup 上显示结果,所以我担心运行多个查询会影响结果的加载时间。

我还尝试了一种使用 UNION 运算符的解决方案,它确实给了我需要的结果,但没有提供标识符来查看它是城市、州还是邮政编码

  $query = $this->db->query("SELECT prison_city FROM ".$this->db->dbprefix('prison')." WHERE prison_city like'%".$keyword."%' LIMIT 1 UNION SELECT prison_zipcode FROM ".$this->db->dbprefix('prison')." WHERE prison_zipcode like'%".$keyword."%' LIMIT 1 UNION SELECT prison_state FROM ".$this->db->dbprefix('prison')." WHERE prison_state like'%".$keyword."%' LIMIT 1 UNION SELECT prison_country FROM ".$this->db->dbprefix('prison')." WHERE prison_country like'%".$keyword."%' LIMIT 1 UNION SELECT prison_address FROM ".$this->db->dbprefix('prison')." WHERE prison_address like'%".$keyword."%' LIMIT 10");


return $query->result();

它输出此数据

Array ( 
[0] => stdClass Object ( [prison_city] => Susanville )
[1] => stdClass Object ( [prison_city] => California )
[2] => stdClass Object ( [prison_city] => 24900 CA-202 )
[3] => stdClass Object ( [prison_city] => New York, America )
[4] => stdClass Object ( [prison_city] => 1 Kings Way, Avenal, CA 93204, USA )
[5] => stdClass Object ( [prison_city] => 14901 Central Ave )
[6] => stdClass Object ( [prison_city] => 19025 Wiley's Well Road )
[7] => stdClass Object ( [prison_city] => 23500 Kasson Rd )
[8] => stdClass Object ( [prison_city] => 475-750 Rice Canyon Rd )
[9] => stdClass Object ( [prison_city] => 19005 Wiley's Well Road )
)

它有两个问题,首先它没有给出标识符,其次是我仅为地址设置的限制,它应用于整个结果。

最佳答案

您可以将 union 与自定义值结合使用。例如:-

    SELECT * FROM (SELECT prison_city , 1 AS type FROM ".$this->db->dbprefix('prison')." WHERE prison_city like'%".$keyword."%' LIMIT 1
) tb1 UNION (SELECT prison_zipcode ,2 FROM ".$this->db->dbprefix('prison')." WHERE prison_zipcode like'%".$keyword."%' LIMIT 1)
UNION (SELECT prison_state,3 FROM ".$this->db->dbprefix('prison')." WHERE prison_state like'%".$keyword."%' LIMIT 1)
UNION (SELECT prison_country,4 FROM ".$this->db->dbprefix('prison')." WHERE prison_country like'%".$keyword."%' LIMIT 1)
UNION (SELECT prison_address,5 FROM ".$this->db->dbprefix('prison')." WHERE prison_address like'%".$keyword."%' LIMIT 10)

并对单独的 LIMIT 子句使用一组子查询。

这是一个工作 fiddle 。

http://sqlfiddle.com/#!9/a6c585/74700

关于php - 如何在 SQL、Codeigniter 中的一个查询中设置不同的限制不同列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52620949/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com