Jump to content
php.lv forumi

Mysql, count ar left join un search ar LIKE un left join


kapec gan ne

Recommended Posts

category 
1 id name 
1 1 AAAA 
1 2 BBBB 

 

names 
1 id c_id name 
1 1 1 AAA 
1 2 1 BBB 
1 3 2 CCC 
1 4 2 DDD 
1 5 1 EEE 
1 6 2 FFF

c_id = id tabulā category

 

$search = 'BBBB'; 
$q_search = '%'.$search.'%'; 
$req = mysql_query("SELECT COUNT(*) FROM `names`...;"); 
$total = mysql_result($req,0); 
$res = mysql_query("SELECT names.*, category.name FROM names LEFT JOIN category ON names.c_id=category.id WHERE category.name LIKE '".mysql_real_escape_string($q_search)."' ORDER BY category.name ASC");

vēlos meklēt tabulā names pēc category.name, tikai nav saprašanas kā tas izdarāms :| nekad nav bijusi saskaršanās count kopā ar left join vai like ar left join

Link to comment
Share on other sites

nezinu, laikam tāpec, ka meklē jau pēc nosaukuma, ne jau pēc konkrēta kategorijas id..

no sākuma, tad drošvien vajadzētu atrast pašas kategorijas ar like un tad ņemties pa names tabulu? :}

ja to var izdarīt vienā selectā, tad labprāt uzzinātu kā

Edited by kapec gan ne
Link to comment
Share on other sites

Labāk jau nu pasaki ko vajag. Vēl jo vairāk tāpēc, ka name ir gan iekš category, gan names tabulas.

Tātad apmēram tā:

- KO īsti grib atrast - kategorijas vai nosaukumus? (ņemot vērā, ka vienai kategorijai ir vesels bars nosaukumu)

- kurā laukā meklē?

- ko grib redzēt (kolonas) rezultātu sarakstā (atkal atceramies, ka vienai kategorijai ir N nosaukumi)?

 

Gints Plivna

http://datubazes.wordpress.com

Link to comment
Share on other sites

gribu atrast visus ierakstus no tabulas names kuriem kategorijas nosaukums atbilst meklētajam..

kurā laukā meklēt? drošvien ka vajadzētu 1 select ielikt (select name from category where id=c_id) as category_name iekš querijā un tad arī pēc tā category_name meklēt !?

gribu redzēt tos pašus ierakstus no tās pašas tabulas kuriem kategorijas nosaukums atbilda meklētajam.. izskatās ka nepadomāju līdz galam ^^

Link to comment
Share on other sites

Paga, bet tad kas tieši tai tavā esošajā vaicājumā nav OK?

Jo spriežot pēc tā ko esi uzrakstījis vārdiem un arī SQLā, tie abi sakrīt.

gribu atrast visus ierakstus no tabulas names kuriem kategorijas nosaukums atbilst meklētajam

mysql> SELECT names.*, category.name
   -> FROM names LEFT JOIN category ON names.c_id=category.id
   -> WHERE category.name LIKE '%BBBB%'
   -> ORDER BY category.name ASC;
+------+------+------+------+
| id   | c_id | name | name |
+------+------+------+------+
|    3 |    2 | CCCC | BBBB |
|    4 |    2 | DDDD | BBBB |
|    6 |    2 | FFFF | BBBB |
+------+------+------+------+
3 rows in set (0.00 sec)

 

 

Tiesa gan LEFT [OUTER] JOIN tur ir bezjēdzīgs, tikpat labi varētu lietot arī INNER JOIN, jo ar to WHERE klauzu priekš ārējās tabulas vairs nekāds ārējais savienojums tāpat nesanāk, viss ir kā parasts savienojums.

 

Gints Plivna

http://datubazes.wordpress.com

 

P.S. Ā tur figurēja kaut kāds count(*), tikai es īsti neiebraucu kādā veidā un kur tam vajadzētu parādīties?

Edited by Gints Plivna
Link to comment
Share on other sites

ar count vajadzētu iegūt ierakstu skaitu, lai varētu visu smuki sadalīt lapā ar LIMIT un uzlikt lapas navigāciju un lai vienā lapā nebūtu simtiem ierakstu :}

 

EDIT:vispār problēma bija izvadē) while($row=mysql_fetch_array($row)) biju nokļūdījies un nevarēju iebraukt kur kļūda

bet ar COUNT(*) gan nezinu

Edited by kapec gan ne
Link to comment
Share on other sites

MySQL dokumentācija un google ir Tavs draugs.

Ja pirmajā linkā pēc šī googles vaicājuma man iedeva vajadzīgo info, kaut gan godīgi atzīstos šo tīri MySQL specifisko f-ju nebiju zinājis.

 

mysql> SELECT SQL_CALC_FOUND_ROWS names.*, category.name
   -> FROM names LEFT JOIN category ON names.c_id=category.id
   -> WHERE category.name LIKE '%BBBB%'
   -> ORDER BY category.name ASC
   -> LIMIT 2, 1;
+------+------+------+------+
| id   | c_id | name | name |
+------+------+------+------+
|    3 |    2 | CCCC | BBBB |
+------+------+------+------+
1 row in set (0.00 sec)

mysql> SELECT found_rows();
+--------------+
| found_rows() |
+--------------+
|            3 |
+--------------+
1 row in set (0.00 sec)

 

Otra iespēja, protams ir rakstīt 2 sql teikumus

- pirmais vienkārši count(*) select listā bez citām kolonām un bez limit

- otrais kā jau sākumā bija.

 

Jā un vēl tā tava pieeja - % priekšā meklējamai simbolu virknei ir absolūts potenciāls ātrdarbības killeris. Nupat vēl pirms mēneša minēju to savā prezentācijā. Nu protams, ja tev ir 5 ieraksti un 3 vaicājumi dienā, tad tas nav svarīgi, bet lielākām lietām silti iesaku tā nedarīt.

 

 

Gints Plivna

http://datubazes.wordpress.com

Link to comment
Share on other sites

Guest
This topic is now closed to further replies.
×
×
  • Create New...