Jump to content
php.lv forumi

Kā no JOIN izdabūt masīvu: elements- tabula?


404

Recommended Posts

Ir vajadzība ar 1 kveriju nolasīt no divām pēc struktūras identiskām tabulām visus datus tā,lai tos varētu ielasīt pēc tam 2 masīvos(katras tabulas datus savā).

Vienā masīvā to ielasu šādi:

$dati=mysql_fetch_array(mysql_query("SELECT * FROM chati,forumi WHERE chati.owner='".$uid."' AND forumi.owner='".$uid."'"))) 

Bet vajadzētu,lai $dati masīvu atgrieztu 2 elementos katru tabulu savā:

$dati[0] // chati

$dati[1] // forumi

Ierakstu saskaitīšanai katrai atsevišķi uzrakstīju šādi:

$cik=mysql_fetch_array(mysql_query("SELECT(SELECT COUNT(*) FROM chati WHERE owner='".$uid."') AS ch,(SELECT COUNT(*) FROM forumi WHERE owner='".$uid."') AS fr ")))  

Tas strādā.Līdzīgi mēģināju ar selectu,bet šādi vairs negāja cauri:

$dati=mysql_fetch_array(mysql_query("SELECT(SELECT * FROM chati WHERE owner='".$uid."')  AS ch,(SELECT * FROM forumi WHERE owner='".$uid."') AS fr ")))  

Saņēmu erroru: Operand should contain 1 column(s)

Vēl mēģināju arī šādu variantu:

$dati=mysql_fetch_array(mysql_query("SELECT * FROM chati JOIN forumi ON (chati.owner='".$uid."' AND forumi.owner='".$uid."') ")))

Strādā,un arī ielasa visu masīvā kā vajag.Bet kā mēģinu to sadalīt ar AS,tā ir errors:

$dati=mysql_fetch_array(mysql_query("SELECT * FROM chati AS ch JOIN forumi As fr ON (chati.owner='".$uid."' AND forumi.owner='".$uid."') ")))
Paziņo: Unknown column 'chati.owner' in 'on clause'

Ja pareizi saprotu,owner lauks šādā pierakstā pirmajā tabulā netiek nemaz atrasts.

Mēģināju vēl šādi,bet tas vispār izrādījās vēl aplamāk:

$dati=mysql_fetch_array(mysql_query("SELECT * FROM chati AS ch ON (chati.owner='".$uid."') JOIN forumi As fr ON (forumi.owner='".$uid."') ")))

Kā to būtu iespējams panākt pareizi?

Edited by 404
Link to comment
Share on other sites

Nezinu, kā ir uzreiz divos masīvos, bet parasti to dara kaut kā šādi (ja pieņemam, ka kolonnu skaits un tipi un nosaukumi abās tabulās vienādi):

SELECT * FROM chati WHERE chati.owner=$uid 
UNION
SELECT * FROM forumi WHERE forumi.owner=$uid

Ja vajag atšķirt, kurš ir kurš, tad var pielikt vēl vienu kolonnu:

SELECT 1, * FROM chati WHERE chati.owner=$uid 
UNION
SELECT 2, * FROM forumi WHERE forumi.owner=$uid

Tagad visiem čatiem nulltais indekss būs == 1 un forumiem == 2.

Bet kāpēc vajag stingri ar vienu vaicājumu? Manuprāt, katram savs vaicājums būtu bijis labāk.

Link to comment
Share on other sites

SELECT (SELECT * FROM `chati` WHERE `owner`='".$uid."') as chats, (SELECT * FROM `forumi` WHERE `owner`='".$uid."') AS formums //4zh risinajums bet vajdzetu stradat

 

 

 

$dati=mysql_fetch_array(mysql_query("SELECT * FROM chati AS ch JOIN forumi As fr ON (ch.owner='".$uid."' AND fr.owner='".$uid."') ")))

Edited by cucumber
Link to comment
Share on other sites

Cucumber variantu:

SELECT (SELECT * FROM `chati` WHERE `owner`='".$uid."') as chats, (SELECT * FROM `forumi` WHERE `owner`='".$uid."') AS formums //4zh risinajums bet vajdzetu stradat

 

jau biju izmēģinājis-tas atgriež erroru: Operand should contain 1 column(s),lai gan ja ir skaitīšanas SELECT(*),tad kļūdu nemeta.

Par variantu selektot katru tabulu atsevišķi-tā arī pirmajā variantā sākotnēji bija.Tā vēlme taisīt vienā radās dēļ uzskata,ka vienam saliktajam pieprasījumam vajadzētu būt ātrākam par 2 atsevišķiem kverijiem.Kā tur ar īsti ir,pašam grūti spriest.Ir lasīti arī pilnīgi pretēji viedokļi.

Alekseja variants ar UNION :

SELECT 1, * FROM chati WHERE chati.owner=$uid 
UNION
SELECT 2, * FROM forumi WHERE forumi.owner=$uid

ar izskatās tieši tas kas vajadzīgs,jo tieši nodalīt katras tabulas datus lai masīvā atšķirtu kuri dati no kuras tabulas,arī bija vēlme.Tik īsti nepieleca,kā uzstādīt to atšķirību. SELECT 1 tas ir domāts,ka tas cipars 1 ir papildus jauna kolona ar nosaukumu 1 vai kādu savu? Tad pieraksts: SELECT 1, * man izraisa erroru.

Edited by 404
Link to comment
Share on other sites

SELECT 1, * ... nozīmē, ka rezultāta datos pirmā kolonnā tiks atgriezsts skaitlis 1 (visiem ierakstiem)

Ja nepatīk skaitļi, lieto stringus:

SELECT "chati", * FROM chati WHERE ...
UNION
SELECT "forumi", * FROM forumi WHERE ...

Link to comment
Share on other sites

Izmēģinājos visādi,bet bez kļūdas strādā tikai šādi:

$sql=mysql_query("SELECT * FROM chati WHERE chati.owner='".$uid."' UNION SELECT * FROM forumi WHERE forumi.owner='".$uid."'"))

Kā priekšā pielieku skaitli:

$sql=mysql_query("SELECT 1,* FROM chati WHERE chati.owner='".$uid."' UNION SELECT 2,* FROM forumi WHERE forumi.owner='".$uid."'")) 
SELECT 1,* 

vai kaut stringu: SELECT "chati",*

tas uzreiz izraisa sintakses kļūdas paziņojumu: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version

Mysql versija man ir 5.0.45 Sanāk,ka vai nu neesmu joprojām sapratis sintaksi,vai arī šī versija neņem tāda tipa pierakstu? ;D

Link to comment
Share on other sites

Varbūt šādi:

SELECT 1 AS KasTasIr, * FROM chati WHERE chati.owner=$uid 
UNION
SELECT 2 AS KasTasIr, * FROM forumi WHERE forumi.owner=$uid

 

Vai arī iespējams, ka MySQL nepatīk *, gadījumos, kad esi radījis mākslīgu kolonnu:

SELECT 1 AS KasTasIr, lauks1, lauks2,...,lauksN FROM chati WHERE chati.owner=$uid 
UNION
SELECT 2 AS KasTasIr, lauks1, lauks2,...,lauksN FROM forumi WHERE forumi.owner=$uid

Link to comment
Share on other sites

Hmm,tiešām uzdodot izvilkt nevis * visas kolonnas,bet tikai noteiktas,viss smuki strādā,bez errora.Vispār jau pāris tajās tabulās bija caur myadmin papildus manuāli pievienotas.Tad laikam sanāk,ka tas arī bija kļūdas cēlonis.

Bet visas atlasīt arī izskatās nemaz nevajadzēs.Šāda tipa ļoti labi pašlaik der:

$sql=mysql_query("SELECT 1 AS data, id,chatname,admin FROM chati WHERE chati.owner='".$uid."' 
                                         UNION
                                         SELECT 2 AS data, id,forumname,admin FROM forumi WHERE forumi.owner='".$uid."' ");

 

Liels paldies,šis noteikti noderēs arī turpmāk :)

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
×
×
  • Create New...