PDA

View Full Version : view گرفتن از دو جدولی که با هم join شدند (حل شد)



pary_daryayi
دوشنبه 12 خرداد 1393, 04:43 صبح
سلام . این کوئری کار میکنه و مشکلی نداره :


$qry="SELECT * FROM question JOIN answer ON (question.id = answer.id_question)" ;

اما با این کد نتونستم ازش view بگیرم :


CREATE ALGORITHM = UNDEFINED VIEW `q-a` AS SELECT * FROM question JOIN answer ON (question.id = answer.id_question)


خطا :


#1060 - Duplicate column name 'id'


احتمالا منظور اینه که کلید اصلی بصورت تکراری ایجاد میشه ؛ اما چطور اصلاح کنم کد رو ؟

MMSHFE
دوشنبه 12 خرداد 1393, 12:17 عصر
راستش خیلی گشتم و چیزی تحت عنوان اضافه کردن پیشوند خودکار به اسامی فیلدها توی MySQL پیدا نکردم که جلوی تداخل نام رو بگیره. برای همین این کد رو براش درنظر گرفتم که فکر میکنم کار کنه (برای من کار کرد) :

SET @sql = NULL;
SELECT CONCAT('CREATE ALGORITHM = UNDEFINED VIEW `q-a` AS SELECT ',GROUP_CONCAT(CONCAT(`table_name`,'.',`column_nam e`,' AS ',`table_name`,'_',`column_name`)),'
FROM `question`
JOIN `answer`
ON (`question`.`id`=`answer`.`id_question`)')
FROM `information_schema`.`columns`
WHERE (`table_name` IN ('question','answer') AND `table_schema`='dbname')
INTO @sql;
PREPARE `stmt` FROM @sql;
EXECUTE `stmt`

MMSHFE
دوشنبه 12 خرداد 1393, 12:27 عصر
فقط بجای dbname اسم دیتابیس خودتون رو بگذارین.

pary_daryayi
دوشنبه 12 خرداد 1393, 12:28 عصر
ممنون . لطف کردین .
من اول کدنویسی view رو شروع کردم به یاد گرفتن و بعد مفهومش رو :لبخندساده:
چه مواقعی از view استفاده میکنیم ؟
من فقط یک تعریف از view میدونم : view یک جدول نمادین هستش

"A View is nothing more than a pseudo table doing the work of a defined query."

چه مواقعی باید ایجاد بشه ؟ در ابتدای ایجاد دیتابیس ؟ یا بر حسب نیاز ، هرجا لازم بود view رو ایجاد کنیم ؟

MMSHFE
دوشنبه 12 خرداد 1393, 12:37 عصر
خوب خودش گفته که: ویو توی MySQL صرفاً یک چیزی شبیه جدوله. یعنی درواقع جدول فیزیکی نیست و رکوردی توش نیست. موقعی که شما View رو ذخیره میکنید، در اصل کوئری مربوطه ذخیره میشه و بهش یک اسم میده و بعنوان مثال وقتی شما میگین `SELECT * FROM `q-a میاد کوئری مرتبط رو اجرا میکنه و رکوردها رو بهتون میده. بیشتر برای سهولت در برنامه نویسیه که نخواین هربار توی کدتون کوئری رو دستی بفرستین و اجرا بگیرین.

pary_daryayi
دوشنبه 12 خرداد 1393, 12:46 عصر
بله یک view با یک کوئری ساده ایجاد کرده بودم و دیدم که یک شبه جدول با نامی که تعیین کرده بودم ایجاد شد .
یعنی دفعات بعد ، اطلاعات این شبه جدولی که ایجاد شده رو میخونیم ؟
بعنوان مثال :


`SELECT * FROM `q-a

چه فرقی داره select کردن بین جدول اصلی و شبه جدول ایجاد شده ؟
یعنی میشه نتیجه گرفت زمانی از view استفاده میشه که در جدول اصلی ما فیلدها و رکوردهای زیادی ذخیره شده و از چند فیلد خاص از این جدول اصلی به دفعات در طول برنامه استفاده میشه .
در این مواقع ، از اون فیلدهای خاص ، یک view میسازیم .؟؟؟ درسته ؟

MMSHFE
دوشنبه 12 خرداد 1393, 13:19 عصر
فرقشون اینه که بجای اینکه هربار فرضاً چنین کوئری بنویسید:

SELECT comments.id AS comments_id,comments.post_id AS comments_post_id,comments.name AS comments_name,comments.url AS comments_url,comments.email AS comments_email,comments.body AS comments_body,comments.public AS comments_public,comments.ts AS comments_ts,comments.confirmed AS comments_confirmed,posts.id AS posts_id,posts.cat_id AS posts_cat_id,posts.title AS posts_title,posts.body AS posts_body,posts.ts AS posts_ts,posts.visible AS posts_visible
FROM `posts`
JOIN `comments`
ON (`posts`.`id`=`comments`.`post_id`)
یکبار این کوئری رو توی یک ویو به اسم فرضی posts_with_comments ذخیره میکنید و بعد، به راحتی توی برنامه مینویسید `SELECT * FROM `posts_with_comments