2016-07-26 82 views
1

这里是我的查询,内部查询给我按日期排序的数组,但如果我使用group by它不断随机重复,而不是第一个或最后一个。在我的情况下,可能会有多个约会与同一个患者ID,但我只需要最新的。有没有一种方法可以使用PHP来保持重复值的第一次出现,并在保留日期排序的同时移除其余部分,或者在查询中执行该操作?如何通过值删除重复的数组元素并保留最新条目?

$sql = 'SELECT * 
FROM (
    SELECT a.patient_id, a.appointment_datetime, b.first_name, b.last_name, b.email 
    FROM '.TABLE_APPOINTMENTS.' a, '.TABLE_PATIENTS.' b 
    WHERE doctor_id='.$doctor_id.' AND a.patient_id = b.id 
    ORDER BY appointment_datetime desc) AS t 
GROUP BY patient_id'; 

输出:内部查询的

Array ([0] => Array ([patient_id] => 1 [appointment_datetime] => 
[1] => Array ([patient_id] => 2 [appointment_datetime] =>) 
[2] => Array ([patient_id] => 3 [appointment_datetime] =>) 
[3] => Array ([patient_id] => 5 [appointment_datetime] => 
[4] => Array ([patient_id] => 20 [appointment_datetime] => 2016-06-29 17:30:00)) 

输出:

Array ([0] => Array ([patient_id] => 20 [appointment_datetime] => 2016-07-14 17:00:00 
) [1] =>Array ([patient_id] => 20 [appointment_datetime] => 2016-07-05 23:00:00) 
[2] => Array ([patient_id] => 20 [appointment_datetime] => 2016-06-29 17:30:00) 
[3] => Array ([patient_id] => 20 [appointment_datetime] => 
[4] =>Array ([patient_id] => 20 [appointment_datetime] =>) 
[5] = Array ([patient_id] => 20 [appointment_datetime] =>) 
[6] => Array ([patient_id] => 1 [appointment_datetime] =>) 
[7] => Array ([patient_id] => 2 [appointment_datetime] =>) 
[8] => Array ([patient_id] => 3 [appointment_datetime] =>) 
[9] => Array ([patient_id] => 5 [appointment_datetime] =>)) 

溶液:

$sql = 'SELECT a.patient_id, max(a.appointment_datetime), b.first_name, b.last_name, b.email 
    FROM '.TABLE_APPOINTMENTS.' a, '.TABLE_PATIENTS.' b 
    WHERE doctor_id='.$doctor_id.' AND a.patient_id = b.id 
    GROUP BY a.patient_id ORDER BY a.appointment_datetime'; 
+0

您可以发布此查询的输出? –

+0

为您的订单添加另一个字段。这里的问题是,你说你想保留“第一个”,但你没有定义日期相同时意味着什么。 – alzee

+0

添加了输出。 @ user3137702,我的意思是重复的第一个实例,也不能/不会是两个具有相同日期(除空),但无论哪种方式,如果id值的存在重复我只需要一次。我正在显示数据,所以当我做一个foreach循环时,我不希望有任何额外的东西,它应该按照最近的约会进行排序。 – nick

回答

1

尝试指定:

$sql = 'SELECT * 
    FROM (
     SELECT a.patient_id, MAX(a.appointment_datetime), b.first_name, b.last_name, b.email 
      FROM '.TABLE_APPOINTMENTS.' a, '.TABLE_PATIENTS.' b 
      WHERE doctor_id='.$doctor_id.' AND a.patient_id = b.id 
      ORDER BY appointment_datetime desc) AS t 
    GROUP BY patient_id'; 

通知的MAX()添加到查询。

祝你好运!

+0

这只给出一个最大日期时间的条目,但我会尽力让它工作,谢谢。 – nick

+1

工作很好,一对夫妇调整! – nick

1

用户in_array删除重复的值,然后尝试推动唯一值到新阵列。

$unique = array(); 
foreach($array as $arr) 
{ 
if(!in_array($arr, $unique)) 
{ 
$unique[] = $arr; 
} 
} 

有了这个,你将得到所有的第一个值。所有重复将被删除。在你的数组值中使用这个概念。它会像一个魅力要直接在您的查询的最新条目

相关问题