假设我有一个表'table_name',其中有两列如下:
table_name
------------
my_id | data
------|-----
id1 | 312
id1 | 523
id1 | 128
id2 | 239
id2 | 479
id2 | 121
id3 | 639
id3 | 429
id3 | 131
id4 | 473
id4 | 872
id4 | 662
id4 | 174
id4 | 272
我试了一会儿,现在我找到了一种方法来选择我想要使用的ID:
SELECT DISTINCT my_id from table_name WHERE (my_id REGEXP 'id[234]')
这给了我'id'id2','id3'和'id4'。我如何根据下面选择的ID制定一个给出我所需输出的查询?
id2 | id3 | id4
---------------
239 | 639 | 473
479 | 429 | 872
121 | 131 | 662
NaN | NaN | 174
NaN | NaN | 272
答案 0 :(得分:1)
首先创建一个选择不同的id
的函数public function get_id_of_table_name() {
$sql = 'SELECT DISTINCT my_id ';
$sql .= 'FROM table_name ';
$query = $this->db->query($sql);
$result = $query->row();
foreach ($result as $key => $value)
{
$result->data = $this->get_data($result->my_id);
}
return ( $query->num_rows() ) ? $result : FALSE;
}
并创建第二个功能,根据id&#39>收集所有数据
public function get_data($my_id) {
$params = [];
$sql = 'SELECT data ';
$sql .= 'FROM table_name ';
$sql .= 'WHERE my_id = ? ';
$params[] = $my_id;
$query = $this->db->query($sql, $params);
$result_data = $query->result();
$data = [];
foreach ($result_data as $result)
{
array_push($data, $result->data);
}
return $data;
}
如果需要,可以在第一个函数中放置where子句。
$sql .= 'WHERE my_id = ? ';
并添加参数
$params[] = $my_id;
你也可以在第一个函数中添加参数my_id作为数组,这样你就可以获得你想要的id
$id = ["id2","id3","id4"];
public function get_id_of_table_name($id) {
$params = [];
$sql = 'SELECT DISTINCT my_id ';
$sql .= 'FROM table_name ';
$sql .= 'WHERE 1 ';
foreach ($id as $my_id)
{
$sql .= 'OR (my_id = ?) ';
$params[] = $my_id;
}
$query = $this->db->query($sql, $params);
$result = $query->row();
foreach ($result as $key => $value)
{
$result->data = $this->get_data($result->my_id);
}
return ( $query->num_rows() ) ? $result : FALSE;
}
答案 1 :(得分:1)
如果您的表格实际上只有这两列,而且没有可用于订购data
列的相关数据,那么就没有好的方法来实现您的排序。寻找。
关系数据没有任何内在的"顺序"即使您已按特定顺序插入数据或在此处以某种方式显示数据。如果你的表真的只有那两列,那么就很难匹配"第一个"使用"第一个"的id2值id3值等等以获得所需的输出。我们可能会在查询中对它们进行排名,并根据该等级(升序或降序)进行匹配,或者甚至提供一些随机订单功能,但是没有记录(即可靠)方式来获取订单你已经提供了。
虽然表确实对存储中的基础位有物理顺序,而某些产品允许您通过物理rowid
(Oracle)访问它们,但我所知道的RDBMS(包括MySql)都不能保证除非在select语句中使用order by
子句,否则将返回行的顺序。这是字面上的设计,被认为是一个"功能"来自E.F. Codd的研究。