چهارشنبه ۰۹ اسفند ۱۴۰۲

Wednesday, February 28, 2024 GMT +3:30

جستجو در مطالب سایت با استفاده از MySQL Full-Text

mysql-fulltext

جستجو در اطلاعات پایگاه داده را می توان جزء اولین و مهمترین نیازهای برنامه های تحت وب برشمرد که تقریبا هر برنامه نویسی در طی تجربه کاری خود با آن مواجه خواهد شد، در MySQL این جستجو از دو طریق میسر است، استفاده از دستور ساده LIKE و توابع Full-Text، دستور LIKE را در آموزش های مقدماتی به صورت جداگانه و مفصل توضیح داده ایم اما یکی از قابلیت های خوب MySQL که از نسخه 3.23 به بعد به آن اضافه شده، توابع Full-Text است که می تواند جهت کسب نتایج جستجوی سریع و تقریبا دقیق مورد استفاده قرار گیرد، هرچند برخی از قابلیت های Full-Text مربوط به کلمات انگلیسی است ولی توانایی آن برای کلمات فارسی آنقدر هست که بتوانیم بدون مشکل از آن استفاده کنیم و یا لااقل یکی از متدهای جستجو را بر مبنای آن قرار دهیم و در متدهای دیگر به فرض از LIKE استفاده نمائیم، در ادامه به توضیح اینکه چرا و چگونه از این قابلیت در کدهای PHP استفاده کنیم خواهیم پرداخت.

چرا باید از Full-Text به جای LIKE یا در کنار آن استفاده کنیم؟


واقعیت این است هر کدام از روش های بالا دارای معایب و محاسنی هستند، به عنوان مثال استفاده از دستور LIKE معمولا نتایج بیشتری را برمی گرداند، شیوه نگارش و استفاده از LIKE ساده تر و به اصطلاح دم دستی تر است اما در عوض ممکن است نتایجی نامربوط یا تکراری داشته باشیم، از طرفی جستجو با متد LIKE در پایگاه داده MySQL مخصوصا در مورد جداولی که محتوای زیادی دارند در مقایسه با Full-Text زمانبرتر است و پردازش کار در این حالت به طور معمول فشار بیشتری به سرور وارد می کند که این موضوع برای سرورهای با توان سخت افزاری پائین می تواند یک مشکل اساسی باشد، علاوه بر موارد گفته شده برخی قابلیت های Full-Text با دستور LIKE بدست نمی آیند که این به ماهیت متفاوت این دو روش برمی گردد.

ایجاد قابلیت Full-Text در جداول MySQL


قابلیت جستجوی Full-Text بر روی ستون هایی از نوع CHAR ,VARCHAR و TEXT و موتور MyISAM قابل اعمال است و هم زمان با ایجاد جدول یا بعد از آن نیز می توانیم به ستون مورد نظر آن را اضافه کنیم، به طور مثال در پرس و جوی نمونه زیر هم زمان با ساخت جدول، قابلیت جستجوی Full-Text را برای ستون فرضی title در نظر گرفته ایم:
CREATE TABLE post(
title VARCHAR(255),
FULLTEXT KEY title(title)) ENGINE=MyISAM
همان طور که اشاره شد می توانیم بعد از ساخت جدول و ستونها نیز جستجوی Full-Text را اضافه کنیم، برای افزودن این قابلیت بعد از ساختن جدول و ستونها، مقادیر SQL زیر را اجرا می کنیم:
ALTER TABLE post ADD FULLTEXT(title);
به این صورت این قابلیت به جدول و ستون موجود اضافه می شود.

شیوه جستجو در Full-Text


شیوه جستجو در Full-Text بر اساس MATCH() ... AGAINST صورت می گیرد:
SELECT title FROM post
WHERE MATCH (title) AGAINST ('$searchword');
برای جستجو از چند ستون در مقادیر MATCH می توانیم از کاما استفاده کنیم، همچنین می توان از قابلیت امتیاز دهی (score) این تابع نیز جهت چینش نتایج استفاده کرد:
SELECT *, MATCH (title) AGAINST ('$searchword') AS score FROM post
WHERE MATCH (title) AGAINST ('$searchword') ORDER BY score ASC
باید توجه کرد که Full-Text برای ایندکس کلمات محدودیت هایی اعمال می کند، از جمله اینکه اگر کلمه ای کمتر از 4 کاراکتر باشد ایندکس نمی شود، اگر کلمه ای در بیش از 50% ردیف ها تکرار شود ایندکس نمی شود، اگر کلمه ای در لیست Stopword ها باشد ایندکس نمی شود (البته این ویژگی مخصوص حروف انگلیسی است) و نهایتا اینکه برای شروع ایندکس کلمات برای جستجوی  Full-Text نیاز به وجود حداقلی از اطلاعات در ردیف ها است.

قابلیت های جستجو در Full-Text


قابلیت های دیگر این تابع جستجوی IN BOOLEAN MODE است که امکانات بیشتری در اختیارمان قرار می دهد (اضافه شده به MySQL از نسخه 4.0.1)، با استفاده از این قابلیت می توانید شمول ابتدا و انتهای یک کلمه را در جستجو تعیین کنید:
SELECT * FROM post WHERE MATCH (title) AGAINST ('+phpcode -htmlcode' IN BOOLEAN MODE);
در مثال بالا اگر کاربر عبارت code را جستجو کند، تیترهای حاوی عبارت phpcode در جستجو خواهند آمد اما تیتر های حاوی عبارت htmlcode در لیست نتایج ظاهر نمی شوند، از ویژگی های جستجو در حالت BOOLEAN MODE نادیده گرفتن قانون 50% است.
اما قابلیت Full-Text با امکان دیگری کامل می شود که Query Expansion نام دارد، همانطور که از معنی Expansion (توسعه) برمی آید نتایج جستجوی معمولی با Full-Text به دلیل اعمال محدودیت ها و سخت گیری در ایندکس کلمات و یا استفاده از Stopword ها، ممکن است بعضا دربرگیرنده همه نتایج نباشد، با افزودن Query Expansion حداقل به لحاظ تئوری می توانیم موارد معمولی تر را نیز در لیست جستجو نشان دهیم:
SELECT title FROM post
WHERE MATCH (title)
AGAINST ('$searchword' WITH QUERY EXPANSION);
دسته بندی: آموزش کاربردی » MySQL
related مطالب بیشتر:
نحوه رسم چارت و نمودار آماری با PHP و MySQL
ساخت فید آر اس اس (RSS Feed) با استفاده از PHP و MySQL
آموزش ساخت فرم عضویت در سایت با PHP و MySQL
آموزش حذف گروهی اطلاعات از MySQL با استفاده از چک باکس
تعویض کد امنیتی Captcha با Ajax و MySQL
دیدگاه
more ۷۳ دیدگاه برای این مطلب ارسال شده است.
more دیدگاه جدید بر اساس تاریخ ارسال در انتهای دیدگاه های موجود نمایش داده می شود.
۰۱:۰۲ ۱۳۹۶/۰۵/۱۱
ببخشید یه مشکلی توی fulltext سرچ در mysql داشتم :
$query="SELECT * FROM balatarin WHERE MATCH (title) AGAINST ('$value')"; 
این به درستی کار میکند و همچنین:
$query="SELECT * FROM balatarin WHERE MATCH (describe) AGAINST ('$value')"; 
هم به درستی کار می‌کند ولی حالت ترکیبی که در مثال شما هم هست کار نمی‌کند:
کد PHP:
$query="SELECT * FROM balatarin WHERE MATCH (title,describe) AGAINST ('$value')";
مشکل از چیه؟
در مثال جایی از این شیوه استفاده نشده؟! برای حالت مد نظرتان می توانید از OR استفاده کنید، مثال:
MATCH (title) AGAINST ('$value') OR MATCH (describe) AGAINST ('$value')
مشکل استفاده از چند ستون در MATCH ممکن است به دلیل استفاده از موتور InnoDB باشد.
mahdyar
۰۸:۰۴ ۱۳۹۶/۱۰/۰۷
سلام
خداقوت
از کمکی که در مساله دوباره نویسی آدرس‌ها بهم داشتید، متشکرم... من دارم یک فیلترینگ درست میکنم که کاربرها مطلبی رو که آپلود کردن اول بره تو لیست سیاه بگرده اگر کلمات عنوان و متن، در لیست سیاه نیست، مطلب اضافه بشه.
برای کوئری گرفتن از دستور like استفاده می‌کنم.
مشکلی که هست اینه که باید حتما کلمات، دقیقاً شبیه به کلماتی باشن که من توی جدول نوشتم.
مثلا اگه کلمه در متن ارسالی فاصله ای داشته باشه کوئری نمی‌گیره...
راهکاری دارید؟
متشکرم
قبل از هر چیز باید بدانیم به هر حال امکان پوشش تمام اشکال کلمات حتی در پیشرفته ترین الگوریتم های موجود وجود ندارد، چون گاهی به فهم انسانی عبارت نیاز است و نمی توان برای تمام موارد الگوی سیستمی تعریف کرد، با توجه به این نکته می توان با توابع REGEXP در MySQL تا حد امکان کنترل بیشتری روی پرس و جو داشت، البته این نیازمند آشنایی قبلی شما با توابع و عبارات باقاعده (Regular Expression) است که خود بحث مفصل دارد.
آشنایی بیشتر با بحث REGEXP در MySQL:
https://www.tutorialspoint.com/mysql/mysql-regexps.htm
mahdyar
۱۹:۲۷ ۱۳۹۶/۱۰/۰۹
بابت راهنمایی تون ممنونم
خداخیرتون بده...
امیر عظیمی
۱۰:۳۴ ۱۳۹۷/۰۱/۲۳
سلام و خسته نباشید خدمت شما
چجوری میشه کوئری رو ست کرد که نزدیکترین کلمه جستجو رو نمایش بده تو خروجی . یعنی کاربر با غلط املایی سرچ کرد نزدیک ترین کلمه رو نشون بده . به این صورت مثلا :
مثلا وقتی من میخوام کلمه abc رو سرچ کنم اشتباهی مینویسم axc یا abccc در حالت عادی نمیاره میخوام رو حساسیت کلمه کار کنم که حتی اگه دو تا حرف درست بود نزدیک ترین کلمه رو جستجو کنه بیاره یا صحیح همون کلمه رو جستجو کنه و پیشنهاد بده به کاربر برای جستجو
برای این منظور باید سیستم اختصاصی ایندکس کلمات و الگوریتم های پیشرفته جستجو بنویسید، در واقع کاری که می خواهید انجام دهید مشابه موتورهای جستجو است، در یک نمای کلی ابتدا باید کلمات صحیح را به عنوان مرجع داشته باشید سپس برای هر کلمه موارد همسان را تعریف نمائید، قاعدتا اجرایی کردن این ساختار ساده نیست و باید تجربه لازم در برنامه نویسی را کسب کرده باشید.
فرزاد
۱۶:۱۹ ۱۳۹۸/۰۱/۰۲
سلام
به این کلمات دقت کنید:
قابلمه، غابلمه
پیچگوشتی، پیچ گوشتی
mohamad, mohammad
hosein, hossein
و ازین قبیل ...
در مورد چنین خواص جست و جو هوشمند حتما باید دیتابیسی کامل از کلمات آلترناتیو ایجاد کنیم و یا روشی از طریق فقط کدنویسی وجود داره؟ این مطلبی که شما گذاشتید بسیار مبتدی بوده و برای جست و جوهای حرفه ای چندان نتایج مطلوبی نخواهد داشت. لطفا در مورد جست و جوی هوشمند کامل توضیح دهید. سپاس
جستجو به صورت هوشمند نیازمند طراحی و پیاده سازی الگوریتم های پیچیده و سیستم ایندکس گذاری است که صرفا به یک مبحث خاص مرتبط نمی شود، در واقع این سیستم می تواند پروژه ای تمام عیار شامل چند قسمت ایندکس گذاری، کاوش، جدول کلمات مشابه و... باشد! در این مطلب سعی شده تا شیوه های سریع و به اصطلاح دم دستی جستجو مبتنی بر امکانات درونی MySQL توضیح داده شود.
۲۳:۰۰ ۱۳۹۸/۱۰/۰۱
سلام طبق اموزش من یک جستجو انجام دادم دو تا مشکل دارم اول اینکه نتیجه چاپ شده رو نمیتونم لینک صحیح بهش بدم دوما با دستورات or و and سعی کردم نه تنها توی جدول یوزر بلکه جدول ایمیل هم جستجو کنه که موفق نشدم فقط از یه جدول استخراج می کنه گاهی از بس مطالب گوناگون میخونم قاطی میکنم... اصلا زبان پی اچ پی شبیه ویژوال بیسیک نیست...
کد من اینه لطفا طبق معمول راهنمایی کنید
<form action="profile.php" method="post">
<input type="text" name="query" size=50 placeholder="نام کاربر مورد نظر را در اینجا تایپ کنید ...">
<input type="submit" name="search" size=40 value="جستجو کن">
</form><br>
if(isset($_POST['search'])){
$searchQuery = $_POST['query'];
$getUsers = mysqli_query($db, "SELECT * FROM users WHERE u_username LIKE '%$searchQuery%'");
$profile_user = $row['u_username'];
while($row = mysqli_fetch_array($getUsers)){
echo '<a href="profile.aspx?user='.$user_username.'" target="_blank">' ;
echo $row['u_username'] . "<br>";
echo '</a>' ;
}
}
?>
لینک صفحه مورد نظر
https://afra.ory.ir/profile.aspx?user=admin
میخوم یوزرهایی که نمایش میده رو لینک دار کنم که بشه روش کلیک کرد بری پروفایل که متاسفانه هر جور متغیر مینویسم خطا میده...
از صبح درگیرم گاهی واقعا نمیتونم پروژه رو تنهایی پیش ببرم... ضمنا به رسم ادب و قدر دانی لینکتون کردم و توی درباره ما هم ازتون تشکر کردم...
برای نوشتن پرس و جوهای ترکیبی بسته به ساختار جداول و ستون ها یا باید از JOIN استفاده کنید یا UNION، اگر بین دو جدول در ستون هایی اشتراک وجود دارد حالت JOIN و اگر هر دو پرس و جو مستقل هستند از دستور UNION استفاده کنید.
تکه کدی که درج کرده اید چند مشکل دارد:
- قسمت مربوط به مقداردهی متغیر profile_user باید داخل حلقه while باشد، آرایه row در حلقه مقداردهی می شود و قبل از آن تعریف نشده است!
- متغیر user_username که در حلقه استفاده شده ظاهرا تعریف نشده است، متغیر profile_user را خارج از حلقه تعریف کرده اید اما در حلقه از متغیر دیگری استفاده کرده اید.
درک ساختار PHP از ویژال بیسیک معمولا ساده تر است!
در خصوص لینک و درباره ما نظر لطف شما است، هر زمان صلاح بود می توانید این موارد را حذف کنید، هیچ اجباری به تشکر و لینک نیست، خوشحال می شویم کمکی در حد توان انجام دهیم.
۰۱:۲۲ ۱۳۹۸/۱۰/۰۳
سلام مجدد ببخشید منظورم رو درست نرسوندم میخوام اطلاعات از یک جدول ولی چند فیلد مختلف جستجو بشه و نمایش بده مثل جستجو در فیلد نام و ایمیل و ...
متغیر تعریف کردم چون کدها رو کامل ندادم فقط این بخشش رو مشکل دارم باز اگر میشه لطفا راهنمایی کنید و کد صحیح رو جهت جستجو و چرا متغیر کپی نمیشه
حل مشکل نیاز به خطایابی و امکان اجرای کدها دارد، مشخص نیست به چه دلیل متغیر user_username (طبق برداشت از توضیحات) مقدار نمی گیرد، قاعدتا اشکالی در کدها وجود دارد که با خطایابی باید اصلاح شود، در مورد AND و OR اگر از نمونه های زیر پیروی کنید نباید مشکلی باشد:
SELECT * FROM table WHERE col_1 = 'value_1' AND col_2 = 'value_2'

SELECT * FROM table WHERE col_1 = 'value_1' OR col_2 = 'value_2'
m.b
۰۹:۴۶ ۱۴۰۰/۱۱/۲۹
با سلام و خسته نباشید
یک سوال داشتم از خدمتتان و اون اینکه من چند باتن دارم مثلا باتنی به نام 25 یا 28 یا 30 میخوام با زدن هر باتن بیاد اطلاعات رو از دیتابیس فراخوانی کنه و ساعت های اون تاریخ که تو دیتابیس ذخیره شده را بیاد برام نمایش بده . مثلا با زدن باتن تاریخ 25ام بیاد ساعت های که مربوط به تاریخ 25 هست را برام نمایش بده .
سوال دومم هم اینکه حالا ساعت هایی که اومده نمایش داده شده را با ساعت هایی را که تو دایوم دارم مقایسه کنه و اگر بین اونا بود بیاد مثلا بگراندش رو سبز کنه این نمونه سورس هام هست با این نمونه سورس ها دقیقا میاد به تاریخ روز تمامی ساعت های ذخیره شده را به درستی فراخوانی می کنه فقط من میخوام با زدن باتن هر تاریخ پایین صفحه این کار انجام بشه . خیلی ممنون و تشکر می کنم که همیشه کمک حال من و سایر دوستان هستین.
حذف شد
متاسفانه سوالتان توضیح ساده ای ندارد و متشکل از چند مرحله مختلف برنامه نویسی و اعمال ویرایش های اساسی در سورس فعلی است، در گام اول باید با زدن هر دکمه در رویداد onclick مقادیر متناظر آن دکمه که می تواند به شکل آرگیومنت اول باشد به صورت تابع Ajax به سرور ارسال و پاسخ سرور بازگشت داده شود، در گام دوم مقادیر دریافت شده با توجه به آرگیومنت دوم تابع که می تواند ID بلاک div مقصد باشد در کدهای جاوا اسکریپت مقایسه و کلاس رنگی سبز یا قرمز و... برای بلاک مورد نظر نسبت داده می شود، انجام تمام این مراحل نیاز به کدنویسی دارد و علاوه بر این کدها باید به صورت واقعی قابل تست و خطایابی باشند، تکه کدی که درج کرده اید بدون نمونه دیتابیس است و در شکل فعلی نمی شود به صورت واقعی برنامه را اجرا و بررسی کرد، ضمن اینکه ایجاد این قابلیت ها چند قسمتی و نوشتن آنها باید همگام با کل پروژه باشد و این رویه خیلی زمانبر خواهد بود.
m.b
۱۶:۳۲ ۱۴۰۰/۱۱/۲۹
سلام مجدد
امکانش هست که نمونه سورس ساده با توجه به کدهام که ارسال کردم که در حالت ساده با زدن یک باتن فقط بیاد ساعت ها رو از دیتابیس فراخوانی کنه بیان کنین و بنویسین. ممنون.
- یک فولدر با نام دلخواه در دایرکتوری www برنامه سرور مجازی (به طور مثال WampServer) و دو فایل با نام های index.html و response.php در آن فولدر بسازید.
- کدهای زیر را در فایل index.html درج کنید:
<!DOCTYPE html>
<html lang="fa">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>وبگو | بررسی نتایج دیتابیس با PHP و JavaScript</title>
<!-- Webgoo.ir -->
<style>
body{
font-family:Tahoma, Geneva, sans-serif;
font-size:12px;
direction:rtl;
}
.green {
background: #98fe98;
}
.red {
background: #fe9898;
}
</style>
<script>
function ajaxRequest(id) {
var xmlHttp;
var respons;
var block = document.getElementById(id);
var value = block.innerHTML;
var result = '';

try {
xmlHttp = new XMLHttpRequest();
} catch (e) {
try {
xmlHttp = new ActiveXObject("Msxml2.XMLHTTP");
} catch (e) {
try {
xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
} catch (e) {
alert("متاسفانه مرورگر شما از ای جکس پشتیبانی نمی کند");
return false;
}
}
}

xmlHttp.onreadystatechange = function () {
if(xmlHttp.readyState == 4 && xmlHttp.status == 200) {
respons = xmlHttp.responseText;

if(respons == value){
block.className = 'green';
} else {
block.className = 'red';
}
document.getElementById("ajax-wait").innerHTML = 'نتیجه از سرور دریافت شد.';
} else {
document.getElementById("ajax-wait").innerHTML = 'لطفا چند لحظه صبر کنید...';
}
}

xmlHttp.open("GET", "response.php?time=" + value, true);
xmlHttp.send(null);
}
</script>
</head>
<body>
<noscript>جاوا اسکریپت در مرورگر شما پشتیبانی نمی شود یا غیرفعال است!</noscript>
<button id="button-1" type="button" onclick="ajaxRequest('12-33');">ارسال درخواست ای جکس</button>
<div id="12-33">12:33</div>
<div id="ajax-wait"></div>
</body>
</html>
- این کدها را هم در فایل response.php قرار دهید:
<?php
/*
//اتصال به دیتابیس
$conn = mysqli_connect("localhost", "dbuser", "dbpass", "dbname");
if(!$conn) {
echo "PHP & MySQL Connection: Error! " . mysqli_connect_errno() . ' - ' . mysqli_connect_error();
exit;
} else {
//نام جدول
$tbl_name = "tblname";

//دریافت امن زمان از سمت کاربر
$time = mysqli_real_escape_string($conn, $_GET['time']);

//استخراج ردیف ها
$query = mysqli_query($conn, "SELECT * FROM $tbl_name WHERE time = $time LIMIT 1");
if(!$query){
echo "Selecting From Table $tbl_name: Error! " . mysqli_error($conn) . '<br>';
} else{
$db_row = null;
while($row = mysqli_fetch_array($query)){
$db_row = $row['time'];
}
}

//چاپ زمان
echo $db_row;
}
//پایان اتصال
mysqli_close($conn);
*/


//جهت تست بدون اتصال دیتابیس
$time = '12:33';
echo $time;
?>
اکنون با فراخوانی فایل index.html در مرورگر از طریق لوکال هاست نمونه کد قابل تست و بررسی است (در صورت عدم آشنایی با این مقوله می توانید در وب در خصوص نحوه کار لوکال هاست و برنامه WampServer جستجو کنید)، مشابه این رویه باید در مورد کدهای اصلی شما اعمال شود که البته در حالت کاربردی پیچیده گی های بیشتری هم دارد.
کمال
۱۳:۵۱ ۱۴۰۱/۰۱/۰۹
با سلام و خسته نباشید
من دیتابیس از قبل دارم که می خوام ایمپورت کنم شناسه های قبلی پر شده اند یعنی اگه شناسه مطلب دیتابیسی که دارم 10 و 12 و 14 باشه این شناسه ها الان توی جدول گرفته شده اند حجم داده ها هم زیاده الان می خوام در صورت ایمپورت کردن دیتابیس قبل شناسه های جدید بگیرن یعنی اگه آخرین مطلب کنونی 1200 باشه دیتابیسی که می خوام ایمپورتش کنم از شناسه 1201 شروع بشه!
آیا امکان داره؟
با تشکر
تا آنجا که اطلاع داریم اگر می خواهید از شماره های خالی میانی استفاده کنید به نظر بهترین روش این است که اطلاعات جدید را در یک جدول موقت درج کنید و سپس در کدهای PHP فرآیند انتقال اطلاعات از جدول موقت و قدیمی به جدول جدید را انجام دهید، دقت داشته باشید سیستم افزایش خودکار (AUTO_INCREMENT) اجازه نمی دهد تا از شماره های میانی استفاده کنید و به صورت خودکار ردیف های جدید را با آخرین شماره وارد می کند، برای رفع این حالت احتمالا باید AUTO_INCREMENT و PRIMARY KEY را از ستون ID حذف و بعد از اعمال تغییرات مجدد به حالت سابق تبدیل کنید، اما اگر صرفا می خواهید از آخرین شماره اطلاعات جدید اضافه شوند اگر نام و تعداد ستون ها یکسان هستند می توانید از برنامه PHPMyAdmin قسمت Import فایل SQL را وارد کنید.
نکته مهم: لطفا قبل از اعمال هر گونه تغییرات و جهت جلوگیری از اشکالات پیش بینی نشده از اطلاعات هر دو جدول پشتیبان کامل داشته باشید.
مسعود
۰۲:۲۱ ۱۴۰۲/۰۹/۱۱
سلام و خسته نباشید
من برای پیدا کردن خریدهایی با شماره های تکراری از این کوئری توی php استفاده می کنم
SELECT * FROM `card` where phone != '' group by phone having count(phone) > 1 and status != 1 order by id desc limit 100
که میگرده خریدهایی که شماره تکراری دارن رو برام پیدا می کنه
status!=1
یعنی خرید موفق نباشه الان این کد زمانی کار می کنه که خرید اول ناموفق باشه و اگه خرید اول موفق و خرید دوم ناموفق باشه نشون نمیده شماره تکراری وجود داره! ولی اگه خرید اول ناموفق باشه و خرید دوم موفق باشه اونو پیدا می کنه! و اگه کلا خریدها ناموفق باشن نشون میده من میخوام کلا تکراری هایی با خرید ناموفق رو برام پیدا کنه حالا چه خرید موفق داشته باشن و چه خرید ناموفق
با تشکر از شما
برای پیدا کردن ردیف های تکراری در MySQL با دو تکرار یا بیشتر و بررسی ستون وضعیت (Status) می توانید از نمونه پرس و جوی زیر استفاده کنید:
SELECT * FROM `card` WHERE phone != '' GROUP BY phone HAVING COUNT(phone) > 1 AND phone IN (SELECT phone FROM `card` WHERE status = '0') ORDER BY id DESC LIMIT 100
مسعود
۰۰:۰۲ ۱۴۰۲/۰۹/۲۶
با تشکر از شما استاد
سپاسگزارم سوال دیگه ای دارم اگه بخوام با preg_match دنبال اسم هایی بگردم که a-z باشند چطوری تابع رو بنویسم؟
مثلا همین کد:
SELECT * FROM `card` WHERE name != ' ' and name like'%a-z%' ORDER BY id DESC LIMIT 100
من گذاشتم کاربران اسم خودشون رو فارسی بذارن ولی بعضی ها انگلیسی می نویسن من می خوام با این تابع این اسم هارو پیدا کنم
با تشکر فراوان
برای جستجوی الگویی خاص در MySQL با عبارات باقاعده می توانیم از تابع REGEXP در پرس و جو استفاده کنیم، به فرض:
SELECT * FROM `card` WHERE name != ' ' and name REGEXP '[a-z]' ORDER BY id DESC LIMIT 100
در صورتی که بخواهیم جستجو به صورت حساس به حروف بزرگ و کوچک انگلیسی باشد باید پارامتر BINARY را هم اضافه کنیم:
SELECT * FROM `card` WHERE name != ' ' and name REGEXP BINARY '[a-z]' ORDER BY id DESC LIMIT 100
مسعود
۲۳:۲۶ ۱۴۰۲/۰۹/۲۶
با تشکر از شما استاد
با وجودی که رکورد وجود داره ولی با php و sql این دستور شمارو که اجرا می کنم هیچ رکوردی رو پیدا نمی کنه!
مشکل از چی هست؟
با عرض پوزش، کاراکترهای قلاب [] از قلم افتاده بود، کد اصلاح شد.
more لطفا پیش از ارسال دیدگاه نکات زیر را مد نظر داشته باشید:
- به سوالات کلی، زمانبر، مبهم و مشکلاتی که تلاشی برای رفع آنها نکرده باشید پاسخ مختصر داده شده یا به بخش برنامه نویسی اختصاصی ارجاع داده می شوند.
- کدها و اسکریپت های طولانی را ترجیحا در یک صفحه وب آنلاین یا به صورت حساب موقت و آزمایشی قرار دهید تا امکان بررسی دقیق مشکل و خطایابی میسر باشد.
- تمام دیدگاه های ارسالی خوانده شده و برای هر کاربر مدت زمان لازم جهت پاسخگویی در نظر گرفته می شود، لطفا از طرح سوالات متعدد در بازه زمانی کوتاه خودداری کنید.



 refresh
10 × 10
4 × 5
20 × 20
=
آخرین دیدگاه ها
more برای دسترسی سریع به یادداشت مربوطه می توانید از لینک مطلب در کادر زیر استفاده کنید.
پـــرتو
سلام خوبید؟ ببخشید مزاحم میشم یه سوال کامپیوتری داشتم اونم اینکه این خطای dll یعنی چی و چطوری رفع میشه ؟ بیشتر توی نرم افزارها...
۱۴۰۲/۱۲/۰۵

سعید
با تشکر از شما دوست عزیز درست شد. دست شما درد نکنه یه سوال دیگه هم دارم چطور میشه توی استایل تصاویر رو فیت...
۱۴۰۲/۱۲/۰۳

سعید
با تشکر از شما درست شد فقط یه مشکلی دارم میخوام شناسه اون مطلب رو اینطوری براش فراخوانی کنم ولی شناسه رو دریافت...
۱۴۰۲/۱۲/۰۲

سعید
با تشکر از شما خیلی خوب بود. فقط یه مشکلی داره، اگه لینک دانلود داخل عکس باشه کار نمی کنه و بازم لینک رو...
۱۴۰۲/۱۲/۰۲

سعید
با سلام و خسته نباشید من یه تابع با php میخوام که لینک های موجود در یک متن رو برام شناسایی کنه بعد به...
۱۴۰۲/۱۲/۰۱

روح اله
سلام چرا وبلاگ من در نتایج یاهو میاید ولی در نتایج گوگل نمیاید؟
۱۴۰۲/۱۱/۲۶

جواد
سلام خسته نباشید. من میخواستم تعداد نامحدودی عدد رو با هم جمع و تفریق کنم از کدوم حلقه باید در public function کلاسم استفاذه...
۱۴۰۲/۱۱/۲۵

محمد
سلام من گوشی نوکیای جاوا دارم که ساعت گویاش فعال شده و به صورت انگلیسی ساعت رو میگه میخواستم ببینم چطور میشه ساعت گویاش...
۱۴۰۲/۱۱/۲۳

پـــرتو
سلام خوبید؟ ممنون از راهنماییتون من ادرس وبلاگ رو براتون ایمیل کردم واقعا ممنونم مچکرم مرسی
۱۴۰۲/۱۱/۱۸

پـــرتو
سلام خسته نباشید ببخشید مزاحم میشم سوال قبلیم رو یادتونه که گفته بودم یه کد بدین که بشه عکس های داخل پست رو فیکس کنه...
۱۴۰۲/۱۱/۱۵

فاطمه
سلام وقت بخیر وب بازدید کننده داره ولی گویا آدرس وب برای برخی از افراد باز نمیشه چه کاری میتونم انجام بدم تا...
۱۴۰۲/۱۱/۰۹

سیاوش آهی
سلام وقت بخیر استاد، من در سایتم ویدیوهای اموزشی دارم و میخوام با دستورات htaccess امکان دانلود آن را غیرفعال کنم ولی در مرورگر (سایت)...
۱۴۰۲/۱۱/۰۷

پـــرتو
خب الان این تگ رو کجا بزارم؟ و تاثیر سراسری یعنی چی؟؟ در مورد هارد هم منظورتون از چندنمونه فایل در دسترس باشد یعنی چی؟؟؟...
۱۴۰۲/۱۱/۰۵

سجاد
با سلام و خسته نباشید من برای جستجو از این فرم استفاده می کنم رو انتخاب می کنم گزینه های جستجو بر...
۱۴۰۲/۱۱/۰۳

پـــرتو
سلام خسته نباشید ببخشید مزاحم میشم می خواستم یه سوال بپرسم اونم اینکه من یه مشکلی کدم داره اینکه عکس وقتی داخل پست می گذارم...
۱۴۰۲/۱۰/۲۸

مریم
سلام. من از قالب های سایت پیچک که استفاده میکنم مطالب رو نشون نمیده و به جاش مینویسه archive title. اما از قالب های پیش...
۱۴۰۲/۱۰/۲۶

بهاره هوشمندی
توی اکشن callback فقط کوئری ها هستند و من دستور die رو جای مناسب گذاشتم چون جای دیگه نمیشه گذاشت! این کوئری ها هستند که...
۱۴۰۲/۱۰/۲۳

بهاره هوشمندی
با تشکر از شما استاد بزرگوار اینو تست کردم لینک رو به درستی شناسایی نمی کنه و ارور میده! وگرنه همون مسیر خودش رو...
۱۴۰۲/۱۰/۲۳

بهاره هوشمندی
با سلام استاد با sleep نمیشه متن به کاربر نشون داد فقط میشه تاخیر ایجاد کرد واسه همین die بهتره ولی من نمی دونم...
۱۴۰۲/۱۰/۲۳

بهاره هوشمندی
با سلام و خسته نباشید واسه ترجمه از این تابع استفاده میکنم
۱۴۰۲/۱۰/۲۲

بهاره هوشمندی
با سلام متاسفانه هرکاری کردم نشد! یه هفته ست درگیرش هستم انگار هیچ راهی نداره البته احتمالا به دستور die باشه ولی اون...
۱۴۰۲/۱۰/۲۱

بهاره هوشمندی
با سلام و خسته نباشید وقتی میخوام با گوگل ترانسلیت متنی رو با php ترجمه کنم عکس ها رو خراب می کنه چون توی...
۱۴۰۲/۱۰/۲۱

بهاره هوشمندی
من تونستم یه جوری کدها رو توی قالب بذارم ولی چون کال بک اصلا فایل ویو نداره و یک چک کنه است هیچ جوری پیام...
۱۴۰۲/۱۰/۱۹

بهاره هوشمندی
با تشکر از شما من فقط اکشنش رو دارم که اکشن به تنهایی کار نمی کنه! :( الان این کد رو توی قالب...
۱۴۰۲/۱۰/۱۹

بهاره هوشمندی
با سلام و با تشکر از شما استاد خیلی خوب بود من توی فریمورک yii صفحه callback ندارم کاربر زمان زیادی برای اکشن...
۱۴۰۲/۱۰/۱۸

بهاره هوشمندی
با سلام لینک رو نگاه کردم خوب بود ولی من میخوام برای کاربر بنویسم که تا ۱۰ ثانیه صبر کنه که کاربر صفحه رو...
۱۴۰۲/۱۰/۱۸

بهاره هوشمندی
با سلام و خسته نباشید استاد لود کردن کوئری های سایت من واسه یه صفحه زیاده و ۱۰ تا ۱۵ ثانیه طول میکشه که...
۱۴۰۲/۱۰/۱۷

سجاد مهدوی
با سلام ببخشید می تونید توی سایت نوبیتکس ثبت نام کنید و با api هایی که دادن یه کد بنویسید که اعلام موجودی رو...
۱۴۰۲/۱۰/۱۰
  در انتظار بررسی: ۱
 پاسخگویی به سوالات ممکن است تا ۲۴ ساعت زمان ببرد.