Tag Archive for sql

MySQL – Easy way to insert rows from one table into a secound

If you are one of the persons there can rip your hair of your head when customers asking you to adding a lot of rows from your MySQL table to another table based on certain requirements.

Then take this little tip possibly helping you to a fun business day

INSERT INTO
   table1 (field1,field2)
 
SELECT
   t2.field1, 
   t2.field2 
 
FROM 
   table2 t2;

I hope you enjoyed this little tip to make your workday more fun.

Udskriv flere gruppe ider ud med kun 1 titel

Idag kom jeg på et kæmpe problem som jeg enligt ikke havde tænkt over før, jeg har lavet SQLen om så den ikke linjere det rigtig som jeg sad og arbjedet med på grund af sikkerheden.

Det der var mit problem var jeg havde nogle kategori grupper med samme navn som skulle printes ud til brugeren men selve kategorien må kun forkomme 1 gang pr titel.

men da man har en gruppe der kan hede Unisex0-2år, unisex2-5år, pige0-2år og dreng0-2 år og alle 4 kategoriere faktisk har produkter indskrvet med en kategori “Fodtøj” gjore at når jeg brugte GROUP BY i SQL at den så samle de her 4 kategoriere med Fodtøj til 1 titel som også var ganske godt, men 1 id som skulle dække alle 4 det var knap så heldigt.

den måde jeg valgte at løse det gjore jeg ved at skrive følge eks. ind og teste at det virket, det var umilbart mit bedste skud på at få det til at gøre som jeg ville have det til, jeg modtager gerne flere eks. hvis i sider der ude og tænker “hold da kæft hvorfor gjore han ikke sådan her” :0)

    1 <?php
    2 $resObj = mysql_query( "
    3 SELECT
    4     c.category_title,
    5     c.category_id
    6
    7 FROM
    8     cateogry c INNER JOIN product p ON c.category_id = p.catid
    9
   10 WHERE
   11     c.group IN('child02','child25','girl02','boy515')
   12
   13 GROUP BY
   14     c.category_id
   15
   16 ORDER BY
   17     c.category_title
   18 " );
   19 $myspace = ' - '. $space;
   20 // Create keys
   21 while( $rowObj = mysql_fetch_object( $resObj ) )
   22 {
   23     if( array_key_exists( $rowObj->category_title , $array ) )
   24     {
   25         array_push($array[$rowObj->category_title], $rowObj->category_id);
   26     }
   27     else
   28     {
   29         $array[$rowObj->category_title][] = $rowObj->category_id;
   30     }
   31 }
   32
   33 // Slice keys out whit ,
   34 foreach( $array AS $key => $value )
   35 {
   36     $iv = 0;
   37     foreach( $value AS $ids )
   38     {
   39         if ( $iv == 0 )
   40             $slice = $ids;
   41         else
   42             $slice .= ','. $ids;
   43
   44         $iv++;
   45     }
   46
   47     echo '<option value="'. $slice .'">'. $space . $key .'</option>';
   48 }
   49 ?>

Det skal siges det jeg har fået ud af denne kode er at den tager alle mine grupper som passer på det match jeg bedere om, smider det i et array, hvis min array key findes pusher den bare til det existerne array og hvis ikke lave den et nyt.

Der næst køre jeg det igennem en foreach løkke og printer så daten ud, lige inden udprint skal jeg have mine id’er i komma formart så jeg kan ligge det dirakte ind i en “IN” funktion i MySQL det gøres ved at køre endnu en foreach løkke igennem og samle mine id’er.

jeg håber på der er nogle der evt. sider med et bud på en smartere måde der inde, og ellers håber jeg at det her eks. er brugbart for jer andre der måske sider i samme suppedas.

Hent indhold ud mellem et tids intaval

Til tider er der at man har brug for at kunne hente nået data ud eks. fra et enkle døgn fra en bestemt dato, jeg har en remlig simple løsning til dette som jeg syndes jeg vil dele med jer der ude.

SELECT
    *

FROM
    table1 t1

WHERE
    t1.push_date >= '2009-07-09 00:00:00' AND
    t1.push_date <= '2009-07-09 23:59:59'

Jeg håber i kan bruge dette eks. til nået, og post gerne hvis i har andre måder man via SQL kan hente dette ud, dette er et eks. som jeg har testet i MySQL 5.1

GROUP BY og WITH ROLLUP function

GROUP BY er en funktion som bruges til at gruper en række rows som det formenligt også ligger i navnet GROUP BY, men man kan også lave nogle trisk som spare SQL serveren og dig selv for tid, det kan være hvis du eks. Har en række tal du gerne vil ha lagt sammen i en indkøbs kurve så kan GROUP BY benyttes på denne måde.

SELECT sum( shopAntal ) AS TotalAntal, sum( shopPris * shopAntal ) AS TotalPris FROM shop_barsket WHERE userId = ‘brugerid’ GROUP BY userId;

denne SQL ligge alle vare antal og alle priseren sammen til et enklet row udtræk så du ikke skal til at køre en while løkke for at tælle det hele sammen endnu en gang og der efter beregne din data.

Når man kommer til at tælle tal sammen og faktisk ikke gider at lave 2 SQL udtræk kan man gøre det hele meget simplet, for at slippe for 2 SQL udtræk kan man lave et WITH ROLLUP satament som tæller alle ens int værdier sammen og til sidst laver et ekster row udtræk hvor den har indeholder NULL i de steder som ikke er INT værdier eller er regnet sammen.

SELECT SUM( shopAntal ) AS TotalAntal, sum( shopPris * shopAntal ) AS TotalPris FROM shop_barsket WHERE userId = ‘brugerid’ GROUP BY produktId, userId WITH ROLLUP;

HAVING function

Når der skal trækkes en bestemt mængte data ud efter eget valg i dette tilfælde alle felter der er under en vis værdi kan man benytte HAVING efter WHERE statement eks.

SELECT * FROM test_felt WHERE bindKatId = 2 HAVING underKat < 5;

Du vil her få listet alle rows ud fra test_felt som har bindKatId = 2 hvorefter der er under 5 underkategoriere, HAVING bruges isted for at man skriver

SELECT * FROM test_felt WHERE bindkatId = 2 AND underKat < 5;