iT邦幫忙

0

PHP 陣列重複值的那筆陣列 丟到新的陣列

  • 分享至 

  • twitterImage

各位高手們 大家好
今天小弟有PHP程式問題想請教
目前本人正在嘗試利用PHP 進行 選取時間區段 判斷重複用藥
首先這是我的資料列
http://ithelp.ithome.com.tw/upload/images/20161124/201031840OMcK6yI4j.png
op5=時間 op111=藥品代碼 op112=藥品名稱

http://ithelp.ithome.com.tw/upload/images/20161124/20103184XmLDk51cGd.png
這是目前選取時間區間的程式,當我輸入帳號密碼 與日期區間我就可以去SQL去查詢我資料庫裡的資料
以下是PHP裡的SQL語法

SELECT * FROM dbo.123 where id = 'id' AND type = 'med'AND op5 BETWEEN '2015-03-01' AND '2015-12-31'

而我現在的進度是做到

		$result = sqlsrv_query($conn,$sql);
		if ($result === false)
		{
			die( print_r(sqlsrv_errors(), true));
		}
	?>
    
	<?php
	//echo $sql;
	while($row=@sqlsrv_fetch_array($result, SQLSRV_FETCH_ASSOC))
	{
	print_r($row); echo "</br>";

透過while($row=@sqlsrv_fetch_array($result, SQLSRV_FETCH_ASSOC))
我可以將我所有的陣列列出來
以下是我針對日期+代碼+藥名 所 echo 出來的資訊
http://ithelp.ithome.com.tw/upload/images/20161124/20103184c29nUJDES1.png
下面倒數四筆 是7天(含)重複用藥的
就想請問各位高手大大們
我應該如何這四筆資料陣列 再拉出來存到另一筆的陣列 (二維陣列嗎?)
新的

Array ( [num] => 36  [op5] => 2015-10-02 [op111] => A034950100 [op112] => 釋痰錠8公絲(布朗信)〝國嘉〞 [type] => med [op113] => 21.00 ) 
.....(以下為重複資料的陣列)

還是有其他更優化的方法
感謝各位

fillano iT邦超人 1 級 ‧ 2016-11-24 13:30:34 檢舉
用sql做啦...你用group by op111,然後select加上count(op111) as count,就能彙整出出現的次數。count大於1就是重複的。
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

2 個回答

WilliamHuang
iT邦研究生 1 級 ‧ 2016-11-24 14:57:40
【**此則訊息已被站方移除**】
0
badbayz
iT邦新手 4 級 ‧ 2016-11-24 15:04:39

估計你想要顯示日期區間全部資料,也要七日內重複用藥資訊吧
我用MySQL 全部放在同一陣列做撒尿牛丸做法是這樣 @@

SELECT
	*,
	CASE WHEN op111 IN (SELECT
	op111
FROM
	`123`
WHERE
	id = 'c123456789'
AND op5 >= DATE_FORMAT(DATE_ADD(NOW(), INTERVAL - 7 DAY),'%Y-%m-%d')
AND type = 'med'
AND op5 BETWEEN '2015-03-01'
AND '2016-12-31'
GROUP BY op111
HAVING 	COUNT(op111) > 1) THEN '重複用藥' ELSE '' END `status`
FROM
	`123`
WHERE
	id = 'c123456789'
AND type = 'med'
AND op5 BETWEEN '2015-03-01'
AND '2016-12-31'

http://ithelp.ithome.com.tw/upload/images/20161124/20090631wu2hUwF3si.jpg

ayo0831 iT邦新手 5 級 ‧ 2016-11-27 15:33:05 檢舉

badbayz 您好

AND op5 >= DATE_FORMAT(DATE_ADD(NOW(), INTERVAL - 7 DAY),'%Y-%m-%d')

因為我是使用MSSQL
這段語法好像會有些問題

CONVERT(VARCHAR(10),GETDATE(),126)

我目前我只能先抓到現在的日期....

badbayz iT邦新手 4 級 ‧ 2016-11-29 11:06:56 檢舉

MSSQL 方式

SELECT
	*,
	CASE WHEN op111 IN (SELECT
	op111
FROM
	[dbo].[123]
WHERE
	id = 'c123456789'
AND op5 >= DATEADD(day, -7, GETDATE())
AND type = 'med'
AND op5 BETWEEN '2015-03-01'
AND '2016-12-31'
GROUP BY op111
HAVING 	COUNT(op111) > 1) THEN 'repeat' ELSE '' END [status]
FROM
	[dbo].[123]
WHERE
	id = 'c123456789'
AND type = 'med'
AND op5 BETWEEN '2015-03-01'
AND '2016-12-31'
0
clui7
iT邦新手 5 級 ‧ 2016-11-24 16:20:10

SQL只取重覆用藥的記錄, 可以直接加上條件

SELECT * FROM dbo.123 where id = 'id' AND type = 'med'AND op5 BETWEEN '2015-03-01' AND '2015-12-31' *AND HAVING COUNT(id)>1*

如果有php只好loop逐行資料比對(op111)有沒有重覆藥品, 把該行資料加到另外一個陣列, 再顯示出來。

我要發表回答

立即登入回答