# پایگاه‌های داده > سایر پایگاه‌های داده > MySQL >  پیدا کردن "نام نام خانوادگی" در فیلد های "نام" ، "نام خانوادگی"

## tabib_m

با سلام
یک تیبل با دو فیلد داریم با نام های زیر:

name
family

دو تا رکورد هم توی این تیبل هست با مقادیر زیر :



1:
name: ali
family: haeri

2:
name: ali reza
family: haeri

حالا فرضا یک نفر میخواد عبارت "ali haeri" رو جستجو کنه، من هم میخوام فقط و فقط رکورد اول نمایش داده بشه
چیکار باید بکنم؟

----------


## arshia_

اگر منظورت این است که جستجوی دقیق باشه  این کد رو امتحان کن:
SELECT * FROM TBLTEST WHERE NAME LIKE 'ALI' AND FAMILY LIKE 'HAERI'     <----CODE 
یا این روش :
SELECT * FROM TBLTEST WHERE NAME = 'ALI' AND FAMILY= 'HAERI'

----------


## mzjahromi

ببین این کد جوابت رو میده

   Select * From TableName Where (Name+' '+Family)='ali haeri'

----------


## tabib_m

> اگر منظورت این است که جستجوی دقیق باشه این کد رو امتحان کن:
> SELECT * FROM TBLTEST WHERE NAME LIKE 'ALI' AND FAMILY LIKE 'HAERI' <----CODE 
> یا این روش :
> SELECT * FROM TBLTEST WHERE NAME = 'ALI' AND FAMILY= 'HAERI'


بابا دست شما درد نکنه! قراره یک نفر توی یک فیلد تکست (مثلا) عبارت "ali Haeri" رو سرچ کنه!
من از کجا باید بفهمم کدوم نامه و کدوم فامیل؟ (یعنی اگه مثلا یارو جستجو کنه : "سید علی رضا طبیب زاده" چجوری میشه فهمید کدوم قسمت نام و کدوم قسمت فامیله؟)




> ببین این کد جوابت رو میده
> 
> کد:
>    Select * From TableName Where (Name+' '+Family)='ali haeri'


خیلی ممنون از پاسختون ، ولی اینم جواب نداد! یعنی هر دو رکورد رو آورد!!!! (من انتظار داشتر ارور بده) :)

----------


## reza_rad

> خیلی ممنون از پاسختون ، ولی اینم جواب نداد! یعنی هر دو رکورد رو آورد!!!! (من انتظار داشتر ارور بده) :)


خوب اول و آخر ورودی یه کاراکتر بذار و بعد چکش کن اینجوری دیگه می بندیش.

----------


## mzjahromi

> خیلی ممنون از پاسختون ، ولی اینم جواب نداد! یعنی هر دو رکورد رو آورد!!!! (من انتظار داشتر ارور بده) :)


مطمئنی این Query  هر دو رکورد رو آورد؟؟؟؟؟؟؟؟؟
مگه همچین چیزی ممکنه؟؟؟؟؟

----------


## tabib_m

> خوب اول و آخر ورودی یه کاراکتر بذار و بعد چکش کن اینجوری دیگه می بندیش.


یعنی جی؟



> مطمئنی این Query هر دو رکورد رو آورد؟؟؟؟؟؟؟؟؟
> مگه همچین چیزی ممکنه؟؟؟؟؟


منم از همینش تعجب کردم!!!!
خوب خودت خیلی سریع میتونی با phpmyadmin تست کنی!

----------


## reza_rad

> یعنی جی؟


منظورم این بود که برای اینکه دنباله ی رشته کاراکترت رو ببندی از یه کاراکتر در دو طرفش استفاده کن. مثلا * یا هر چیز دیگه. البته شاید راه خوبی نباشه ولی فکر کنم جواب بده:

Select * From TableName Where ('*'+Name+' '+Family+'*')='*ali haeri*'

----------


## tabib_m

بازم هر دو رو آورد :)

----------


## tabib_m

دوستان راه دیگه ای سراغ ندارن؟

----------


## mzjahromi

میشه کدی رو که استفاده می کنید عینا اینجا بنویسیدش؟

----------


## alirezador

دوست عزیز از اونجایی که من فهمیدم شما میگید که اگر هر دو تا مشخصات در یک textbox داده میشه که این عملا غیر ممکنه چون این غضیه سیستم های خبره هستش که با استفاده از پردازش کاراکتری حدث بزنه که کدام قسمت اسم و کدام قسمت فامیل هستش اگر در دو text box جداگانه اسم و فایل را بگیری و دنبالش بگردی یعنی select کنی حتما به نتیجه میرسی و دنبال اون یکی هم نگرد چون باید پروفسر تشنه لب یا دکتر میر محسنی و یا دکتر شهریار لطفی را باید ببینی و این پروژه دکترا هستش

----------


## tabib_m

> میشه کدی رو که استفاده می کنید عینا اینجا بنویسیدش؟


منظورت رو نمیفهمم. چه کدی رو باید اینجا بنویسم؟ بحث فقط بحث یک select ه.




> دوست عزیز از اونجایی که من فهمیدم شما میگید که اگر هر دو تا مشخصات در یک textbox داده میشه که این عملا غیر ممکنه چون این غضیه سیستم های خبره هستش که با استفاده از پردازش کاراکتری حدث بزنه که کدام قسمت اسم و کدام قسمت فامیل هستش اگر در دو text box جداگانه اسم و فایل را بگیری و دنبالش بگردی یعنی select کنی حتما به نتیجه میرسی و دنبال اون یکی هم نگرد چون باید پروفسر تشنه لب یا دکتر میر محسنی و یا دکتر شهریار لطفی را باید ببینی و این پروژه دکترا هستش


فکر کنم درست منظور من رو متوجه نشدی. چون من دنبال این نیستم که اسم و فامیل رو جدا کنم!! من فقط میخوام ، دو تا فیلد با هم ترکیب بشن و بعد عبارت مورد نظر توی اون فیلد جستجو بشه. دیگه نمیدونم چجوری توضیح بدم.

----------


## alirezador

شما منظورت اینه که کل کلمه مثلا " علیرضا دوراندیشیان " در یک text box داده بشه و تو بفهمی که " علیرضا " اسم طرفه و " دوراندیشیان " فامیل بعد اونها را از هم جدا کنی و بعد تو 2 تا متغیر قرار بدی و در 2 فیلد جدا گانه دنبال اونها بگردی درسته؟

----------


## nematia

شاید با concat به نتیجه برسی

----------


## alirezador

منظورتون از concat چی هستش یک جایی خونده بودم ولی یادم رفته فکر کنم مباحثه جاوا باید باشه

----------


## nematia

راهنمای MySQL رو ببینید

----------


## tabib_m

> شما منظورت اینه که کل کلمه مثلا " علیرضا دوراندیشیان " در یک text box داده بشه و تو بفهمی که " علیرضا " اسم طرفه و " دوراندیشیان " فامیل بعد اونها را از هم جدا کنی و بعد تو 2 تا متغیر قرار بدی و در 2 فیلد جدا گانه دنبال اونها بگردی درسته؟


نه درست نیست.
اینی که تو میگی یک راه حل *هست* ، و کار من رو هم *راه میندازه* ، اما موفقیت این راه حل تقریبا محاله، چون تشخیص نام از نام خانوادگی کار آسونی نیست.

من فقط میخوام یک عبارت ، در دو فیلد به صورت مشترک جستجو بشه. یعنی انگار که (تأکید میکنم : انگار که) یک فیلد وجود داره ، و اینطوری میتونیم بنویسیم:


select * from `table_name` where `NameFamily`='$search';


امیدوارم دیگه ایندفعه منظورم رو فهمیده باشی.




> شاید با concat به نتیجه برسی


به راهنمای مای اس کیو ال هم مراجعه کردم ، اما چیز زیادی نفهمیدم ، ببخشید ، انگلیسیم ضعیفه .  :خجالت:

----------


## nematia

این کتاب جالب تر توضیح داده:
OReilly - MySQL Cookbook.chm

3.6 Combining Columns to Construct Composite Values
3.6.1 Problem
You want to display values that are constructed from multiple table columns. 

3.6.2 Solution
One way to do this is to use CONCAT( ). You might also want to give the column a nicer name by using an alias. 

3.6.3 Discussion
Column values may be combined to produce composite output values. For example, this expression concatenates srcuser and srchost values into email address format: 

CONCAT(srcuser,'@',srchost)
Such expressions tend to produce ugly column names, which is yet another reason why column aliases are useful. The following query uses the aliases sender and recipient to name output columns that are constructed by combining usernames and hostnames into email addresses: 

mysql> SELECT
    -> DATE_FORMAT(t,'%M %e, %Y') AS date_sent,
    -> CONCAT(srcuser,'@',srchost) AS sender,
    -> CONCAT(dstuser,'@',dsthost) AS recipient,
    -> size FROM mail;
+--------------+---------------+---------------+---------+
| date_sent    | sender        | recipient     | size    |
+--------------+---------------+---------------+---------+
| May 11, 2001 | barb@saturn   | tricia@mars   |   58274 |
| May 12, 2001 | tricia@mars   | gene@venus    |  194925 |
| May 12, 2001 | phil@mars     | phil@saturn   |    1048 |
| May 13, 2001 | barb@saturn   | tricia@venus  |     271 |
...

----------


## alirezador

اگر شما سورس برنامه html و php را اینجا بزارین مشکل حل میشه من فکر میکنم مشکل شما مفاهیم data base management هستش

----------


## tabib_m

> mysql> SELECT
> -> DATE_FORMAT(t,'%M %e, %Y') AS date_sent,
> -> CONCAT(srcuser,'@',srchost) AS sender,
> -> CONCAT(dstuser,'@',dsthost) AS recipient,
> -> size FROM mail


راستش رو بخواید من از این نوع سلکت چیزی سر در نمیارم  :خجالت:  .
در مورد متن انگلیسی هم که گفتم . بازم  :خجالت:  .
اگه میتونید *خودتون* توضیح بدید ، خیلی ممنون میشم.




> اگر شما سورس برنامه html و php را اینجا بزارین مشکل حل میشه من فکر میکنم مشکل شما مفاهیم data base management هستش


من دیگه واقعا نمیدونم چجوری شیر فهمت کنم.
عزیز دل من ، من فقط با یک تیبل و یک سلکت کار دارم ، همین.
من تستم رو دارم توی phpmyadmin انجام میدم.
سؤالی که من اینجا پرسیدم از این حد خارج تر نیست.
من یک تیبل دارم ، با فیلدها و مقادیری که گفتم، و حالا میگم چجوری باید دستور سلکت رو بدم که اون نتیجه ی مطلوب رو بدست بیارم.

خیلی ممنون.

----------


## tabib_m

کسی از دوستان راهی سراغ نداره؟

----------


## I,Nobody

اول اون فیلدهای name و family رو توی تیبلت FULLTEXT کن. بعدش این رو تست کن :

SELECT * FROM `mytable` WHERE MATCH(name,family) AGAINST('%$SERACH%' WITH QUERY EXPANSION)

----------


## tabib_m

جواب نداد. :(

یعنی ارور داد.


*Database test - table fam running on localhost*

*Error*

SQL-query : 

SELECT * FROM `fam` WHERE MATCH(name,family) AGAINST('%ali heidari%' WITH QUERY EXPANSION) LIMIT 0, 30

MySQL said:

Something is wrong in your syntax près de 'WITH QUERY EXPANSION) LIMIT 0, 30' à la ligne 1

----------


## I,Nobody

ورژن mysqlت چنده؟
اگه زیر 4.1 هست، اون عبارت WITH QUERY EXPANSION رو بردار

----------


## reza_rad

از CONCAT(str1,str2,...) استفاده کردی یا نه؟
مثال:

mysql> SELECT CONCAT('My', 'S', 'QL');
        -> 'MySQL'


به اینجا هم یه نگاهی بنداز ببین مشکلت رو حل می کنه؟
http://dev.mysql.com/doc/refman/5.1/...functions.html

----------


## I,Nobody

ای ول.
رضا کمک خوبی کرد.
اینو تست کن :

SELECT CONCAT_WS( ' ', first_name, last_name ) AS full_name
FROM `my_table`

----------


## reza_rad

من اینو تست کردم:

SELECT * 
FROM ali
WHERE (

SELECT concat( name, ' ', family ) 
) = 'ali haeri'



جواب میده :)

----------


## tabib_m

> ورژن mysqlت چنده؟
> اگه زیر 4.1 هست، اون عبارت WITH QUERY EXPANSION رو بردار


ورژن مای اس کیو ال من اینه :  3.23.49-max-nt
اون عبارت رو هم برداشتم ، این دفعه هر دو رکورد رو اورد. :(




> ای ول.
> رضا کمک خوبی کرد.
> اینو تست کن :
> 
> کد:
> SELECT CONCAT_WS( ' ', first_name, last_name ) AS full_name
> FROM `my_table`


این هم جواب نداد :( . یعنی یک نتیجه ی عجیبی (برای من) داشت . به تصویر ضمیمه نگاه کنید.

SELECT * 
FROM ali
WHERE (

SELECT concat( name, ' ', family ) 
) = 'ali haeri'

این رو هم تست کردم و ارور زیر رو داد :
Error

SQL-query :  

SELECT * FROM `fam` WHERE (SELECT concat( name, ' ', family ) 
) = 'ali haeri' LIMIT 0, 30

MySQL said: 


Something is wrong in your syntax près de 'SELECT concat( name, ' ', family ) 
) = 'ali haeri' LIMIT 0, 30' à la ligne 1



البته فکر میکنم این مشاکل به خاطر ورژن مای اس کیو ال باشه .
در هر حال از کمک همه تون خیلی خیلی ممنونم.

در ضمن ، لینکی که آقای راد دادن خیلی باحال بود ، دستتون درد نکنه :)

----------


## reza_rad

خواهش می کنم.
طبیب جان mysql ورژن بالاتر نصب کن خوب. اینجوری خیلی محدود میشی ها!

بعدش هم اینو تست کن :

SELECT concat( name, ' ', family ) = 'ali haeri'
FROM ali


دستور concat  توی ورژنی که داری هم کار باید بکنه.

----------


## tabib_m

خیلی ممنون.
باز هم یک نتیجه ی عجیب دیگه! :(

----------


## oxygenws

نتیجه اش عجیب نیست...
نسخه MySQL شما قدیمی است و subselect رو پشتیبانی نمی کنه، البته نیازی هم به استفاده از subselect نیست!!!
این رو تست کن:

SELECT * FROM table_name
WHERE CONCAT(name, ' ', family) = 'ali haeri'


خوش باشی :)

----------


## tabib_m

ایول
خیلی خوشم اومد، درست شد
 :لبخند گشاده!:   :لبخند گشاده!:   :لبخند گشاده!:  
 :تشویق:   :تشویق:   :تشویق:  
واقعا دست شما درد نکنه
برای من شده بود یک دردسر
باز هم ممنون
امیدوارم در تمامی مراحل زندگیتون همچنان موفق و سربلند باشید :)

----------


## reza_rad

> از هم یک نتیجه ی عجیب دیگه!


نتیجه عجیب نبود درست بود!
like وقتی روی رکورد ها اعمال میشه سطرهای درست رو 1 و غلط ها رو 0 برمی گردونه.

----------


## tabib_m

به هر حال از تمامی دوستان به خاطر کمکی که کردن ممنونم.


پ.ن: میبخشید فضولی میکنم، آقایون reza_rad و oxygenws با هم نسبتی دارید؟؟

----------


## reza_rad

خواهش می کنم :)




> آقایون reza_rad و oxygenws با هم نسبتی دارید؟؟


نسبت که نه. ولی امیدجان استاد ما هستند:)

----------


## oxygenws

چوب کاری نفرمایید...
سپاسگذارم.

----------

