۱ شهریار حسین زاده
جواب سوال جناب وحید صالحی عزیز
جامعه وردپرس (برنامه نویسی) ایجاد شده در ۲۷ آبان ۱۴۰۱

سلام و درود بنده یک تاپیک باز کرده بودم با عنوان "توضیح بیشتر در رابطه به relation"

متاسفانه دستم خورد و تاپیک و بستم که به نظرم باید کسی که تاپیک و باز کرده بتونه خودش روی باز و بسته شدن تاپیک مدیریت داشته باشه که متاسفانه اینجوری نیست

تشکر میکنم از جناب صالحی عزیز به خاطر وقتی که گذاشتن و جواب سوال بنده را کامل دادن

یک سوالی پرسیده بودن که بنده به نوبه خودم جواب میدم حالا دوستان دیگه هم اگر دوست داشتن نظراتشون و بفرماییند

========================== سوال جناب صالحی============================

حالا شما کوئری زیر رو به عنوان تمرین اینجا برامون بگید که چی کار می‌کنه ;-)

سایر دوستان هم خواستن مشارکت کنن...

کوئری جالبیه و ذهن رو بخوبی درگیر می‌کنه البته ساده هم هست با ظاهری نسبتا پیچیده و گول زننده :-)

در ضمن یه نکته داره تفاوت LIKE با = و نقیضشون رو هم بگید NOT LIKE با =!

$args = array(
	'post_type'  => 'product',
	'meta_query' => array(
		'relation' => 'OR',
		array(
			'key'     => 'color',
			'value'   => 'orange',
			'compare' => '=',
		),
                array(
                        'relation' => 'AND',
                        array(
                                'key' => 'color',
                                'value' => 'red',
                                'compare' => '=',
                        ),
                        array(
                                'key' => 'size',
                                'value' => 'small',
                                'compare' => '=',
                        ),
		),
	),
);
$query = new WP_Query( $args );

=========== جواب بنده :

آرایه اول و آرایه دوم میتونه یکیشون هم صدق کند که کوئری جواب داشته باشه چون از OR استفاده کردیم (یعنی میتونه یا اولی و یا دومی و یا هردو درست باشه)

آرایه اول میگه : color باید دقیقا مساوی نارنجی باشه

آرایه دوم که خودش از ۲ آرایه تشکیل شده و شرط بین ۲ آرایه داخلی هم "باید" بر قرار باشه چون از AND استفاده کردیم

و آرایه‌های داخلی هم میگویند :

اولین آرایه داخلی میگه :‌ color دقیقا باید مساوی قرمز باشه

دومین آرایه داخلی میگه : size دقیقا باید مساوی small باشه

و این دو آرایه داخلی همان طور که عرض کردم باید جفتشون برقرار باشند چون از AND استفاده شده

-- تفاوت بین Like و = :

  • like یعنی شبیهشم بود پیدا کن , مثلا ما داخل یک سرچ دنبال ایمیل کاربرانی میگردیم که اول ایمیلشون با a شروع شده باشه

هم alireza@gmail.com را میاورد هم atefe@gmail را میاورد

** البته میتونیم هم بنویسیم که اولش مثلا با a شروع شه ما بقیه کلماتش هرچی بود

و هم میتونیم بنویسیم که مثلا با a تمام شه و حالت مختلف دیگه هم داره که داکیومنت sql اون در آدرس ذیل هست

https://www.w3schools.com/sql/sql_like.asp

  • = (مساوی) : یعنی دقیقا باید همون کلمه باشه , دقیقا خلاف توضیح بالایی , یعنی باید دقیقا بنویسیم که دنبال مثلا کاربر alireza@gmail.com هستیم وگرنه کوئری برامون چیزیو نمی‌آورد.

-- تفاوت بین NOT LIKE و =! :

  • NOT LIKE : یعنی شبیهش نباشد , مثلا اگر ما در سناریو بالا که عرض کردم سرچ داریم و دنبال ایمیل کاربری میگردیم که با a شروع شده باشد ,

اگر از NOT LIKE استفاده کنیم دیگه alireza@gmail.com و atefe@gmail.com را نمیاورد , "ولی همه ایمیل‌های دیگرو میاورد"

  • =! : یعنی دقیقا اون کلمه و یا شرطی که گذاشتیم نباشد مثلا اگر ما داخل کوئری بزنیم دنبال کاربرانی میگردیم که مثلا سنشون ۳۰ نباشه

وقتی از "=!" استفاده کنیم :

همه ی کاربرانی را که سنشون ۳۰ نیست را می‌آورد

یعنی مثلا کسانی که ۳ سالشون هست را می‌آورد ۲۹ و ۲۸ و ۳۱ و ۳۲ و .....

به جز کسانی که ۳۰ سالشون هست

توضیحات بالا را با حالت‌های زیر میتونیم داخل سایت w3schools.com تست و اجرا کنیم و نتایج و ببینیم

تست حالتهای مختلف با کوئری‌های زیر :‌ https://www.w3schools.com/sql/trysql.asp?filename=trysql_select_like

حالت اول LIKE : که از ۹۱ کاستومری که دیتابیسش داره فقط ۴ تا رو می‌آورد که با a شروع شده باشد .

SELECT * FROM Customers
WHERE CustomerName LIKE 'a%';

حالت دوم NOT LIKE : که از ۹۱ کاستومری که دیتابیسش داره همرو می‌آورد به جز اون ۴ تایی که از این پترن پیروی میکنند . (نتایج رو با حالت بالا مقایسه کنید)

SELECT * FROM Customers
WHERE CustomerName NOT LIKE 'a%';

حالت سوم = (مساوی) : که از ۹۱ کاستومری که دیتابیسش داره فقط ۱ دونه کوئری بر میگردونه که دقیقا باید

"Alfreds Futterkiste" کلمه باشد

(یعنی حتی اگر به جای کلمه کامل "Alfreds Futterkiste" کلمه ی "Alfreds" را فقط بنویسیم هم , چیزی برامون بر نمیگرده فقط باید کاملا تطابق داشته باشد )

SELECT * FROM Customers
WHERE CustomerName = 'Alfreds Futterkiste';

حالت چهارم =! : که از ۹۱ کاستومری که دیتابیسش داره , همرو برمی گردونه جز کسی که اسمش دقیقا

"Alfreds Futterkiste" باشد

SELECT * FROM Customers
WHERE CustomerName != 'Alfreds Futterkiste';

در آخر امیدوارم توضیحاتم مفید بوده باشد , با تشکر

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

جوابتون درسته و توضیحاتتون کامل و مناسب..

احمد اسماعیلی ۲۷ آبان ۱۴۰۱، ۱۰:۴۰