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个问题
这可以通过对该级别的四个简单查询来解决,同时在id字段上随机排序,并为该级别使用适当的限制子句。顺便说一下,这些是问题中的级别数

如果您确实希望在给定级别上选择随机问题,您可能希望使用子查询来完成此操作。
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个问题
这可以通过对该级别的四个简单查询来解决,同时在id字段上随机排序,并为该级别使用适当的限制子句。顺便说一下,这些是问题中的级别数

如果您确实希望在给定级别上选择随机问题,您可能希望使用子查询来完成此操作。
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++)
{