Php 按with in子句的顺序获取记录-in子句中有重复的值
我有桌上问题Php 按with in子句的顺序获取记录-in子句中有重复的值,php,mysql,foreach,where,Php,Mysql,Foreach,Where,我有桌上问题 id | question | question_level ______________________________________ 1 | abc | 1 ______________________________________ 2 | prs | 3 ______________________________________ 3 | oesl | 2 _____________________
id | question | question_level
______________________________________
1 | abc | 1
______________________________________
2 | prs | 3
______________________________________
3 | oesl | 2
______________________________________
4 | ocsl | 3
______________________________________
5 | qoindos | 1
______________________________________
6 | xyz | 3
______________________________________
7 | mnlop | 2
______________________________________
8 | cllse | 2
______________________________________
9 | teuosn | 4
______________________________________
10 | ulcd | 2
______________________________________
我想选择10条与问题级别匹配的记录
我希望所有记录的级别顺序如下
1,2,1,2,3,2,4,2,3,3
输出应该是
id | question | question_level
______________________________________
1 | abc | 1
______________________________________
3 | oesl | 2
______________________________________
5 | qoindos | 1
______________________________________
7 | mnlop | 2
______________________________________
2 | prs | 3
______________________________________
8 | cllse | 2
______________________________________
9 | teuosn | 4
______________________________________
10 | ulcd | 2
______________________________________
4 | ocsl | 3
______________________________________
6 | xyz | 3
______________________________________
我尝试了不同的解决方案,但无法获得正确的输出
尝试使用field,在集合中找到,但没有成功。
提及[
但在上升的顺序中只得到计数和记录
我尝试了以下解决方案
SELECT question_level FROM `tbl_questions` WHERE `question_level` IN (1,2,1,2,3,2,4,2,3,3) ORDER BY FIELD(`question_level`, 1, 2, 1, 2, 3, 2, 4, 2, 3, 3) LIMIT 10
SELECT question_level FROM tbl_questions WHERE FIND_IN_SET(`question_level`,'1,2,1,2,3,2,4,2,3,3');
SELECT question_level,question_object_name,question_object_path,question_answer
FROM tbl_questions e JOIN (SELECT 1 AS question_level UNION ALL
SELECT 2 UNION ALL
SELECT 1 UNION ALL
SELECT 2 UNION ALL
SELECT 3 UNION ALL
SELECT 2 UNION ALL
SELECT 4 UNION ALL
SELECT 2 UNION ALL
SELECT 3 UNION ALL
SELECT 3
) matches
USING (question_level) LIMIT 10;
我也尝试过foreach循环,但每次当问题级别与值匹配时,都会得到相同的记录
$array = explode(',', '1,2,1,2,3,2,4,2,3,3')
foreach ($array as $value) {
SELECT question_level FROM tbl_questions
WHERE question_level = $value;
}
如果在mysql中不可能,那么可以使用php实现
提前感谢从逻辑上讲,您想要做什么是不可能的,我将尝试使用您的订单选择来解释
ORDER BY FIELD(`question_level`, 1, 2, 1, 2, 3, 2, 4, 2, 3, 3)
因此,这里我们需要1
然后2
然后1
再次出现问题层次
。现在在表中我们有了这些值。我只关心问题层次#1,这就是我需要说明我的观点的全部内容
id | question | question_level
______________________________________
1 | abc | 1
______________________________________
5 | qoindos | 1
______________________________________
如您所见,我们为问题_level=1
设置了行,现在系统如何决定哪个级别1
是第一级,哪个是第二级。无法决定如何执行此操作。因此,无论数据库是否未能按您希望的方式对其进行排序。如果没有更多信息进行选择,就无法构建循环even排序。您最好按主键排序,然后按级别排序。您很可能必须在服务器端进行排序
我认为您在这里犯的错误是,您需要使用问题的实际唯一ID,如果您对每个级别的问题数量有限制,则需要单独解决
希望这是有道理的
如果您试图选择x
在n
级别上的随机问题数量,这些问题可以相当容易地解决。例如,如果您想要
- 1级2个问题
- 第2级的4个问题
- 第3级的3个问题
- 4级有1个问题
RAND()
有一些性能损失,您应该能够绕过这些损失,只需将主键随机化,然后加入表中,在数据排序后将其余数据取出。但是,您应该对其进行基准测试
举个例子
SELECT
q1.*
FROM
tbl_questions AS q1
JOIN
(
SELECT
id
FROM
tbl_questions
WHERE
question_level = 1
ORDER BY RAND() LIMIT 2
) AS q2 USING( id )
尽管我不得不承认我从来没有尝试过这只是我的一个想法。从逻辑上讲,做你想做的事情是不可能的,我会尝试用你的订单选择来解释
ORDER BY FIELD(`question_level`, 1, 2, 1, 2, 3, 2, 4, 2, 3, 3)
因此,这里我们需要1
然后2
然后1
再次出现问题层次
。现在在表中我们有了这些值。我只关心问题层次#1,这就是我需要说明我的观点的全部内容
id | question | question_level
______________________________________
1 | abc | 1
______________________________________
5 | qoindos | 1
______________________________________
如您所见,我们为问题_level=1
设置了行,现在系统如何决定哪个级别1
是第一级,哪个是第二级。无法决定如何执行此操作。因此,无论数据库是否未能按您希望的方式对其进行排序。如果没有更多信息进行选择,就无法构建循环even排序。您最好按主键排序,然后按级别排序。您很可能必须在服务器端进行排序
我认为您在这里犯的错误是,您需要使用问题的实际唯一ID,如果您对每个级别的问题数量有限制,则需要单独解决
希望这是有道理的
如果您试图选择x
在n
级别上的随机问题数量,这些问题可以相当容易地解决。例如,如果您想要
- 1级2个问题
- 第2级的4个问题
- 第3级的3个问题
- 4级有1个问题
RAND()
有一些性能损失,您应该能够绕过这些损失,只需将主键随机化,然后加入表中,在数据排序后将其余数据取出。但是,您应该对其进行基准测试
举个例子
SELECT
q1.*
FROM
tbl_questions AS q1
JOIN
(
SELECT
id
FROM
tbl_questions
WHERE
question_level = 1
ORDER BY RAND() LIMIT 2
) AS q2 USING( id )
尽管我不得不承认我从来没有尝试过这一点,但这只是我的一个想法。我用php解决了这个问题
$sequence = "1,2,1,2,3,2,4,2,3,3";
$seq_arr = explode(',', $sequence);
步骤1:
已创建用于存储所有详细信息的数组
$questions = array(); // to store all questions
$final_questions = array(); // tos store final questions in the sequence needed
$level_1 = array(); // level 1 questions
$level_2 = array(); // level 2 questions
$level_3 = array(); // level 3 questions
$level_4 = array(); // level 4 questions
$level_5 = array(); // level 5 questions
步骤2:
从数据库中选择所有数组,并根据问题级别存储在每个数组中
$this->db->select(*);
$this->db->from(questions);
$query = $this->db->get();
$result = $query->result_array();
for ($i=0; $i<count($result) ; $i++) {
if(isset($result[$i]) && !empty($result[$i])){
if($result[$i]['question_level'] == 1)
{
$level_1[] = $result[$i];
}
if($result[$i]['question_level'] == 2)
{
$level_2[] = $result[$i];
}
if($result[$i]['question_level'] == 3)
{
$level_3[] = $result[$i];
}
if($result[$i]['question_level'] == 4)
{
$level_4[] = $result[$i];
}
if($result[$i]['question_level'] == 5)
{
$level_5[] = $result[$i];
}
}
}
$this->db->select(*);
$this->db->from(问题);
$query=$this->db->get();
$result=$query->result_array();
对于($i=0;$i$value){
如果($value==1)
{
对于($i=0;$i<计数($i数组);$i++)
{
if(设置($level_1[$i])&&!空($level_1[$i])){
if(!in_数组($level_1[$i],$final_questions))
{
$final_questions[]=$level_1[$i];
打破
}
}
}
}
如果($value==2)
{
对于($i=0;$i<计数($i数组);$i++)
{
if(设置($level_2[$i])&&!空($level_2[$i])){
if(!in_数组($level_2[$i],$final_questions))
{
$final_questions[]=$level_2[$i];
打破
}
}
}
}
如果($value==3)
{
对于($i=0;$i<计数($i数组);$i++)
{