PDA

View Full Version : سوال: مشکل در جستجوی تاریخ



علی رضائی
شنبه 26 مرداد 1392, 12:22 عصر
سلام. من 2 تا فیلد دارم
1- نام بیمار
2- تاریخ بستری

وقتی می خوام جستجو کنم از 3 عدد باکس استفاده می کنم
1- نام بیمار
2- از تاریخ
3- تا تاریخ

اگر کد جستجو به این صورت باشد و فیلدها را خالی بگذاریم و کلید سرچ را بزنم کل اطلاعات جدول را بدون فیلتر می آورد و مطلوب است
$result=mysql_query("SELECT * FROM mytable WHERE bimar LIKE '%$bimar %'");

اما اگر فیلد های تاریخ را به کدها اضافه کنیم و باکس ها خالی باشد جستجو هیچ نتیجه ای را نمی آورد و مشکل اینجا است
$result=mysql_query("SELECT * FROM mytable WHERE bimar LIKE '%$bimar %' AND dateofadmission BETWEEN '$dateofadmission1' and '$dateofadmission2'");

لطفا علت را برایم توضیح دهید ممنون از وقتی که می گذارید

engmmrj
شنبه 26 مرداد 1392, 13:40 عصر
به این دلیل است که شما از ANd استفاده کرده اید وقتی شما از AND استفاده میکنید باید هر دوتا شرط TRUE باشه ، در اینجا بهتره از OR استفاده کنید ، OR : به این معنی " یا " است یعنی اگر یکی از شرط ها TRUE بود .
موفق باشید .

علی رضائی
شنبه 26 مرداد 1392, 14:11 عصر
به این دلیل است که شما از ANd استفاده کرده اید وقتی شما از AND استفاده میکنید باید هر دوتا شرط TRUE باشه ، در اینجا بهتره از OR استفاده کنید ، OR : به این معنی " یا " است یعنی اگر یکی از شرط ها TRUE بود .
موفق باشید .

فرمایش شما درست ولی وقتی می خوام مثلا نام بیمارانی که اسمشان حسین است و محدوده تاریخی اول تا نیمه ماه بستری شده اند جستجو کنم با روش شما کلیه افرادای که در این تاریخ ها هستند حتی نام غیر از حسین را می آورد. فکر کنم مشکل مربوط به
Like
و
BETWEEN
باشد.

parsboy
شنبه 26 مرداد 1392, 15:25 عصر
فرمایش شما درست ولی وقتی می خوام مثلا نام بیمارانی که اسمشان حسین است و محدوده تاریخی اول تا نیمه ماه بستری شده اند جستجو کنم با روش شما کلیه افرادای که در این تاریخ ها هستند حتی نام غیر از حسین را می آورد. فکر کنم مشکل مربوط به
Like
و
BETWEEN
باشد.
باسلام
دوست عزیزم در پست 3 اشاره فرمودند،و جواب داده شد
زمانی که شما از AND استفاده میکنید باید هر دوشرط True باشداما زمانی که ازدستورOR استفاده میکنید
اگرهرکدام ازشرط ها TRUE باشد خروجی TRUE هست اما شما باز اومدی از همون AND استفاده کردی!
مشکل اینکه نام های دیگرهم میاد اینه که شما اومدی ازدستور between استفاده کردی .
موفق باشید.

کامروا
شنبه 26 مرداد 1392, 15:38 عصر
اگر از OR استفاده کنید جواب درستی نخواهید گرفت.
در واقع همان AND درست هست ولی چون میخواهید زمانی که مقداری را وارد نکردید، تمام افراد را نشان دهد، باید شرط قرار دهید که اگر مقدار فیلدها خالی بود از کوئری زیر استفاده کند :

$result=mysql_query("SELECT * FROM mytable WHERE bimar LIKE '%$bimar %'");

و در صورتی که خالی نبود ، از این کوئری :

$result=mysql_query("SELECT * FROM mytable WHERE bimar LIKE '%$bimar %' AND dateofadmission BETWEEN '$dateofadmission1' and '$dateofadmission2'");


میتونید این کار رو از درون خود PHP انجام بدهید یا از طریق SP در MySQL.

موفق باشید

علی رضائی
شنبه 26 مرداد 1392, 15:45 عصر
اگر از OR استفاده کنید جواب درستی نخواهید گرفت.
در واقع همان AND درست هست ولی چون میخواهید زمانی که مقداری را وارد نکردید، تمام افراد را نشان دهد، باید شرط قرار دهید که اگر مقدار فیلدها خالی بود از کوئری زیر استفاده کند :

$result=mysql_query("SELECT * FROM mytable WHERE bimar LIKE '%$bimar %'");

و در صورتی که خالی نبود ، از این کوئری :

$result=mysql_query("SELECT * FROM mytable WHERE bimar LIKE '%$bimar %' AND dateofadmission BETWEEN '$dateofadmission1' and '$dateofadmission2'");


میتونید این کار رو از درون خود PHP انجام بدهید یا از طریق SP در MySQL.

موفق باشید

مقادیر فیلد ها از یک صفحه دیگه به این صفحه پست می شن.
توی این صفحه چطوری باید شرطم رو بنویسم که خالی بودن اونها رو از صفحه قبل تشخیص بده؟

کامروا
شنبه 26 مرداد 1392, 16:11 عصر
مقادیر فیلد ها از یک صفحه دیگه به این صفحه پست می شن.
توی این صفحه چطوری باید شرطم رو بنویسم که خالی بودن اونها رو از صفحه قبل تشخیص بده؟

بهرحال شما مقادیر ارسالی به صفحه دیگر رو از طریق GET_$ یا POST_$ دریافت میکنید در همونجا میتونید از طریق تابع ()empty چک کنید ببینید خالی هست یا نه.

SP هم به این شکل میشه که بیشتر حالت ها رو درنظر میگیره. این SP رو همینجوری نوشتم و تست نکردم ولی بنظرم درسته.


CREATE PROCEDURE `testdb`.`SP_Get_Bimar_Info` (IN `Bimar` varchar(20), IN `Start_Date` varchar(10), IN `End_Date` varchar(10))
BEGIN
declare Bimar_Str varchar(50);
SET Bimar_Str = QUOTE(CONCAT('%', `Bimar`, '%'));
IF (TRIM(`Bimar`) != '' AND TRIM(`Start_Date`) != '' AND TRIM(`End_Date`) != '') THEN
SELECT * FROM `myTable` WHERE `bimar` LIKE Bimar_Str AND `dateofadmission` BETWEEN `Start_Date` AND `End_Date`;
ELSEIF (TRIM(`Bimar`) != '' AND TRIM(`Start_Date`) != '') THEN
SELECT * FROM `myTable` WHERE `bimar` LIKE Bimar_Str AND `dateofadmission` >= `Start_Date`;
ELSEIF (TRIM(`Bimar`) != '' AND TRIM(`End_Date`) != '') THEN
SELECT * FROM `myTable` WHERE `bimar` LIKE Bimar_Str AND `dateofadmission` <= `End_Date`;
ELSEIF (TRIM(`Bimar`) != '') THEN
SELECT * FROM `myTable` WHERE `bimar` LIKE Bimar_Str;
ELSE
SELECT * FROM `myTable`;
END IF;
END

ویرایش شد

Tarragon
شنبه 26 مرداد 1392, 16:37 عصر
سلام
بهتر نسیت از php کمک بگیرند؟
خیلی راحت تر هستش اخه

علی رضائی
شنبه 26 مرداد 1392, 18:32 عصر
سلام
بهتر نسیت از php کمک بگیرند؟
خیلی راحت تر هستش اخه

اقا امین اگر لطف کنید و با
php
توضیح بدید ممنون می شم.