PDA

View Full Version : یک سوال مبنایی درباره ارتباط php با mysql



DelDard
سه شنبه 09 آبان 1396, 11:50 صبح
سلام دوستان برنامه نویس

فرض کنید ما دو تا تیبل تو دیتا بیس داریم به نام های people و friendship که اولی مثلا مشخصات بچه های یه کلاسه و دومی میگه که کی با کی دوست بوده و برای هر دوستی یه ردیف تو دیتا بیس ایجاد میکنه کالمن هاشون به شرح زیره:

people : unique_id, name, last_name
friendship: first_unique_id, second_unique_id

خب میدونیم که وقتی ما یه فرم معمولی داریم که میخاد یه سری اطلاعات از دیتا بیس بگیره یا تغییر بده خب خیلی اسون یه ریکوئست میفرستیم و میگیم سلکت فلان چیز از بهمان تیبل و بعد نتایج رو میگیریم و نشون میده تو بروزر.
حالا فرض کنید ما میخایم کوئری رو که فرستادیم نتایج رو بگیره از یه تیبل و بر مبنای نتایجی که گرفته نتایج دیگری رو از تیبلی دیگه بگیره و بعد به کد php ما ارسال کنه.
مثلا میخام بچه هایی که اسمشون سارا هست رو از تیبل people انتخاب کنه (مثلا 5 نفر اسمشون سارا هست) و بعد تمام کسانی که با این 5 تا سارا ها دوست شده اند رو از تیبل friendship پیدا کنه بهمون بده.

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

پیشاپیش از وقتیکه شما دوستان میگذارید بسیار ممنونم.

plague
سه شنبه 09 آبان 1396, 14:35 عصر
نه تو حلقه کوئری کوئری زدن کار اشتباهیه
اول با یه گوئری همه یوزر ها رو میخونی بعد میزاری تو حلقه و آیدی هاشون رو در میاری توی یک آرایه بعد همه دوستان رو با یک کوئری از اون 1 آرایه میخونی

$users = select * from users where name like '%sara%'
$user_ids = [];
foreach($users as $user )
$user_ids[]= $user['id'];

$friends = select * from friends table where first_id IN (explode(',' , $user_ids ) ) OR second_id IN (explode(',' , $user_ids ) )


بعد میتونی با یه حلقه سوم نتایج 2 کوئری رو به هم وصل کنی





$final_export = [] ;
foreach($users as $user )
{
$this_user = $user ;
$this_user['friends'] = [] ;
foreach($friends as $friend )
{
if($friends['first_id'] == $user['id'] || $friends['second_id'] == $user['id'])
$this_user['friends'][] = friends;
}

$final_export[] = $this_usre ;

}
چند نکته
1 - من این رو همینجوری نوشتم تا کانسپتش رو متوجه بشی حتما اررور سینتکس داره
2 - البته یه سری توابع شاید باشه که بعضی کارارو برات ساده تر کنه مثلا آیدی های کاربر ها رو شاید با pg_fetch_all_columns بتونی بخونی نیاز نباشه تو حلقه بزاری من ساده ترین شکل ممکن رو گفتم
3 - اگه از فریم ورک استفاده کنی احتمالا یه راهکاری برای اینکار داره نخاد دستی همش رو انجام بدی مثلا لاراول با استفاده از relation ها همه اینکار رو اتومات انجام میده

Unique
پنج شنبه 11 آبان 1396, 01:43 صبح
ببین ! مثالی که زدی را باید تفسیر کنی. شما رکوردهایی از جدول friendship را میخوای که یکی از طرفین اسمش سارا نباشه (یعنی اگه دو تا سارا باشن و با هم دوست باشن نادیده گرفته میشن !)

select t2.unique_id,t3.unique_id from friendship t1 left join people t2 on t1.unique_id = t2.first_unique_id left join people t3 on t1.unique_id = t3.second_unique_id where t2.name <> t3.name and (t2.name = 'سارا' or t3.name = 'سارا')

حالا توی حلقه خروجی اونایی که اسمشون سارا نیست را چاپ کن که میشه دوستان کسانی که اسمشون سارا هست!