Topic: uzklausa su group by

Sveiki,

turiu tokia lentele

id             laukas1            laukas2     laukas3
1              abc                  def           ghi
2              abc                  def           ghi
3              abc                  def           ghi
4              123                 345           567
5              123                 345           567
6              123                 345           567

kaip matyti 1-3 ir 4-6 eilutes vienodos neziurint i id lauka, darau uzklausa

mysql_query(select * lentele group by laukas1, laukas2, laukas3)

atsakyma gaunu dvi eilutes:

abc  def   ghi
123  345  567

tarkim redaguoju pirmos eilutes rezultatus ir pakeiciu juos tarkim taip

a1b  d2f   g3i

problema tame kad nesugalvoju-nezinau, kaip parasyti uzklausa ar kaip istraukti sugrupuotu eiluciu id, kad po to galeciau vykdyti update uzklausa visiems sugrupuotiems irasams, siuo atveju 1-3 eilutei.

Re: uzklausa su group by

Tai teisingas būdas būtų: iškelti laukas1, laukas2 ir laukas3 į atskirą lentelę. Tokiu atveju pas tave struktūra gautūsi panaši į:

lentele:
id             laukas
1              1
2              1
3              1
4              2
5              2
6              2

lentele_laukai:
id             laukas1            laukas2     laukas 3
1              abc                  def           ghi
2              123                 345           567

Su redagavimu ir aplamai su duomenų vientisumu/teisingumu būtų mažiau problemų.

Netesingas, bet veikiantis būdas (tuo atveju kai negali keisti struktūros ir reikia vienkartinio/greito "hack'o"):

SELECT GROUP_CONCAT(id SEPARATOR ',') AS id_list,
   laukas1, laukas2, laukas3
FROM lentele
GROUP BY laukas1, laukas2, laukas3

UPDATE lentele
SET laukas1 = 'nauja reiksme', laukas2 = 'nauja reiksme', laukas3 = 'nauja reiksme'
WHERE id IN ($id_list)

čia $id_list yra reikšmė paimta iš pirmos užklausos rezultato.

Tiesa, šitas dalykas veiks tik nuo MySQL 4.1.x versijos.

Dar gali būti tarpinis variantas, kai išsisaugai visų trijų laukų reikšmes. Tarkim $laukas1, $laukas2 ir $laukas3. Tada atnaujinti lentelę gali:

UPDATE lentele
SET laukas1 = 'nauja reiksme', laukas2 = 'nauja reiksme', laukas3 = 'nauja reiksme'
WHERE laukas1 = $laukas1
  AND laukas2 = $laukas2
  AND laukas3 = $laukas3

Re: uzklausa su group by

aciu, paziuresim kas iseis

Re: uzklausa su group by

o kaip istraukti id_list su php, nes man kazko nesigauna...

Re: uzklausa su group by

O galima tiksliau sužinoti kas nesigauna?

Re: uzklausa su group by

na parasau taip:

$uzklausa=mysql_query("SELECT GROUP_CONCAT(id SEPARATOR ',') AS id_list, laukas1, laukas2, laukas3 FROM lentele GROUP BY laukas1, laukas2, laukas3");
$rez_sk = mysql_num_rows($uzklausa);
for ($i=0; $<$rez_sk; $i++)
   {
       $isvedimas = mysql_fetch_array($uzklausa) or die ("Klaida");
    echo $isvedimas['id_list'].", ";
    }

klaida meta ties eilute:

$isvedimas = mysql_fetch_array($uzklausa) or die ("Klaida");

Itariu kad blogai traukiu id_lista

Re: uzklausa su group by

$uzklausa=mysql_query("SELECT GROUP_CONCAT(id SEPARATOR ',') AS id_list, laukas1, laukas2, laukas3 FROM lentele GROUP BY laukas1, laukas2, laukas3") or die(mysqel_error());
$rez_sk = mysql_num_rows($uzklausa) or die(mysql_error());
for ($i=0; $<$rez_sk; $i++)
{
$isvedimas = mysql_fetch_array($uzklausa) or die (mysql_error());
echo $isvedimas['id_list'].", ";
}

Ir matysi visas klaidas. Tikriausiai pas tave yra per žema MySQL versija, nes jau rašiau, kad GROUP_CONCAT() funkcija veikia tik nuo MySQL 4.1.x;

Re: uzklausa su group by

Na mysql versija MySQL 5.0.18-nt
o klaida gaunu ties sita eilute:

$isvedimas = mysql_fetch_array($uzklausa) or die (mysql_error());

Klaida:

Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in d:\test\id_group.php on line 55
Klaida: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '(id SEPARATOR ',')as id_list, laukas1 from lentele group by laukas1' at line 1

Re: uzklausa su group by

Kažką netaip darai, tik nepastebiu ką ;)

Veikiantis pvz.:

mysql> EXPLAIN test;
+---------+------------------+------+-----+---------+----------------+
| Field   | Type             | Null | Key | Default | Extra          |
+---------+------------------+------+-----+---------+----------------+
| id      | int(10) unsigned | NO   | PRI | NULL    | auto_increment |
| laukas1 | varchar(255)     | NO   |     | NULL    |                |
| laukas2 | varchar(255)     | NO   |     | NULL    |                |
+---------+------------------+------+-----+---------+----------------+

mysql> SELECT * FROM test;
+----+---------+---------+
| id | laukas1 | laukas2 |
+----+---------+---------+
|  1 | vienas  | du      |
|  2 | du      | trys    |
|  3 | vienas  | penki   |
|  4 | du      | trys    |
+----+---------+---------+

mysql> SELECT GROUP_CONCAT( id SEPARATOR ',') FROM test GROUP BY laukas1, laukas2;
+---------------------------------+
| GROUP_CONCAT( id SEPARATOR ',') |
+---------------------------------+
| 2,4                             |
| 1                               |
| 3                               |
+---------------------------------+

Re: uzklausa su group by

Taip pat pas tave FOR ciklo antraštėje yra klaida ;)

11 (edited by Dratas 2007-03-28 11:43:49)

Re: uzklausa su group by

na tu viska darai ant mysql'o, o man reikia per php issitraukt, bet rodos jau pavyko, per phpmyadmin istraukiau koda, dabar rezultatas tinkamas gaunas

$buzkl = 'SELECT GROUP_CONCAT( id SEPARATOR \',\' ) as id_list FROM lentele GROUP BY laukas1, laukas2, laukas3 LIMIT 0, 30' or die ("Klaida ".mysql_error());
            $brezultatas = mysql_query($buzkl)or die ("Klaida1 ".mysql_error());
            $bnr = mysql_num_rows($brezultatas)or die ("Klaida2 ".mysql_error());
            for ($bnd=0; $bnd < $bnr; $bnd++)
                {
                    $bdb_rezas = mysql_fetch_array($brezultatas) or die ("Klaida3 ".mysql_error());
                    echo $bdb_rezas['id_list']."; ";
                }

aciu uz uzvedima ant kelio

P.S. php keikesi del to, kad uzklausa buvo parasyta tarp "" kabuciu, pakeitus i ' viskas susitvarko

Re: uzklausa su group by

ar imanoma suformuoti uzklausa, kuri duotu ta pati rezultata jei mysql versija zemesne uz 4.1

Re: uzklausa su group by

Atskirais atvejais galima kažką padaryti, o bendru atveju geriau nepradėt ;)