Avatar billede nixir Nybegynder
07. april 2007 - 16:29 Der er 2 kommentarer og
1 løsning

Uoverskuelig forespørgelse (lidt php indover - men primært MySQL)

Jeg har lavet en større MySQL forespørgelse (end hvad jeg er vant til)...

Der er desværre bare en fejl. Den siger min query ikke er korrekt, men nu har jeg kigget på den i en lille 1 time, søgt på nettet etc.

Nu tænkte jeg jer eksperter herinde skulle have en chance for at tjene nogle nemme point :)

Jeg ved godt jeg har skrevet emnet under MySQL, men alligevel vil jeg smide min forespørgelse ind som jeg har skrevet den i php. Håber i kan klare og se på det.

Jeg ønsker at finde alle "kioske" i et givent postnumme og derefter vil jeg tjekke om "kiosken" er åben. Hvis mode=all skal alle lukkede kiosker stadig listes, men hvis den er lukket skal det kunne mærkes.

Herefter er det tanken at alle funde "kiosker" skal udskrives...

Her er det i php:

<?php
include("includes/config.php");

$query = "SELECT open_day, COUNT(kiosk_id) AS intKiosks, kiosk_name, kiosk_id, zip_city, kiosk_address FROM jk_kiosks AS k ";
$query .= "JOIN jk_zipcodes AS z ON z.zip_zip=k.kiosk_zip ";
if($_GET['mode']!='all') {
    $query .= "JOIN jk_openings AS o ON o.kiosk_id=k.kiosk_id AND ";
    $query .= "o.open_day = ".date("N")." AND ";
    $query .= "o.open_from <= ".date("dm")." AND ";
    $query .= "o.open_to >= ".date("dm")." ";
} else {
    $query .= "LEFT JOIN jk_openings AS o ON o.kiosk_id=k.kiosk_id AND ";
    $query .= "o.open_day = ".date("N")." AND ";
    $query .= "o.open_from <= ".date("dm")." AND ";
    $query .= "o.open_to >= ".date("dm")." ";
}
$query .= "WHERE kiosk_zip = ".$_GET['zip']." ";
$query .= "GROUP BY kiosk_name, kiosk_id, zip_city";

$kiosks_query = mysql_query($query);

if($kiosks_query['intKiosks']>=1) {
    // Et eller flere resultater ... Udskrives her - burde virke når query er korrekt
} else {
    // Ingen "kioske" fundet ...
}
?>

Forespørgelsen hevet ud (mode er IKKE defineret):

"SELECT open_day, COUNT(kiosk_id) AS intKiosks, kiosk_name, kiosk_id, zip_city, kiosk_address FROM jk_kiosks AS k JOIN jk_zipcodes AS z ON z.zip_zip=k.kiosk_zip JOIN jk_openings AS o ON o.kiosk_id=k.kiosk_id AND o.open_day = ".date("N")." AND o.open_from <= ".date("dm")." AND o.open_to >= ".date("dm")." WHERE kiosk_zip = ".$_GET['zip']." GROUP BY kiosk_name, kiosk_id, zip_city"

date("dm") burde udskrive den aktuelle tid ... fx kl 12 bliver udskrevet 1200 og kl halv 2 bliver udskrevet 0130.

date("N") burde udskrive den aktuelle dag som et tal... Fx er mandag 1 og søndag 7.

$_GET['zip'] burde være aktuel zipcode.


Tabelstruktur: (den ryger fint ind i min database - men er der nogle fejl at spotte må de også gerne skrives):

CREATE TABLE `jk_kiosks` (
  `kiosk_id` int(11) NOT NULL auto_increment,
  `kiosk_username` varchar(20) NOT NULL default '',
  `kiosk_password` varchar(32) NOT NULL default '',
  `kiosk_name` varchar(80) NOT NULL default '',
  `kiosk_url_name` varchar(80) NOT NULL default '',
  `kiosk_address` varchar(80) NOT NULL default '',
  `kiosk_zip` int(4) NOT NULL default '0',
  `kiosk_phone` int(8) NOT NULL default '0',
  `kiosk_mail` varchar(100) NOT NULL default '',
  `kiosk_text` text NOT NULL,
  `kiosk_active` varchar(32) NOT NULL default '',
  `kiosk_jk_fee` int(2) NOT NULL default '0',
  `kiosk_type` int(1) NOT NULL default '0',
  `kiosk_timestamp` int(16) NOT NULL default '0',
  PRIMARY KEY  (`kiosk_id`)
) TYPE=MyISAM AUTO_INCREMENT=1 ;

INSERT INTO `jk_kiosks` (`kiosk_id`, `kiosk_username`, `kiosk_password`, `kiosk_name`, `kiosk_url_name`, `kiosk_address`, `kiosk_zip`, `kiosk_phone`, `kiosk_mail`, `kiosk_text`, `kiosk_active`, `kiosk_jk_fee`, `kiosk_type`) VALUES
(1, 'marks', 'marks123', 'Marks Diner', 'Marks_Diner', 'Min gade 1', '2750', '12345678', 'mail@just-kiosk.dk', 'Marks Diner er PERFEKT !', 2, 5, 1),
(2, 'znuggles', 'znuggles123', 'Znuggles Diner', 'Znuggles_Diner', 'Min gade 2', '2765', '12345678', 'mail@just-kiosk.dk', 'Znuggles Diner er PERFEKT !', 2, 5, 2);


CREATE TABLE `jk_openings` (
  `open_id` int(11) NOT NULL auto_increment,
  `open_day` int(1) NOT NULL default '0',
  `open_from` varchar(4) NOT NULL default '',
  `open_to` varchar(4) NOT NULL default '',
  `kiosk_id` int(11) NOT NULL default '0',
  PRIMARY KEY  (`open_id`)
) TYPE=MyISAM AUTO_INCREMENT=1 ;

INSERT INTO `jk_openings` (`open_id`, `open_day`, `open_from`, `open_to`, `kiosk_id`) VALUES
(1, 1, 0800, 2000, 1),
(2, 2, 0800, 2200, 1),
(3, 3, 0800, 2000, 1),
(4, 4, 0800, 2200, 1),
(5, 5, 0800, 2000, 1),
(6, 6, 0800, 2200, 1),
(7, 7, 0800, 2000, 1),
(8, 1, 0800, 2001, 2),
(9, 2, 0800, 2002, 2),
(10, 3, 0800, 2003, 2),
(11, 4, 0800, 2004, 2),
(12, 5, 0800, 2005, 2),
(13, 6, 0800, 2006, 2),
(14, 7, 0000, 0000, 2);


CREATE TABLE `jk_zipcodes` (
  `zip_id` int(11) NOT NULL auto_increment,
  `zip_zip` int(4) NOT NULL default '0',
  `zip_city` varchar(50) NOT NULL default '',
  PRIMARY KEY  (`zip_id`)
) TYPE=MyISAM AUTO_INCREMENT=1 ;

INSERT INTO `jk_zipcodes` (`zip_id`, `zip_zip`, `zip_city`) VALUES
(1, 800, 'Høje Taastrup'),
(2, 877, 'Valby'),
(3, 900, 'København C'),
(4, 1000, 'København K'),
......... osv ...


Håber ikke i dræber mig verbalt hvis jeg har gjort noget forkert. Hvis jeg har glemt nogle info er det heller ikke med vilje for at spilde jeres tid...

Ville gerne give mere end 200 point, for hvis jeg får 2 rigtig gode svar der løser 2 forskellige problemer ville jeg gerne havet kunne give lidt mere, men i må nøjes med hvad jeg kan give jer...

(Hvordan laver man en flot "kod-boks" herinde? bare et lille tillægs spg.)
Avatar billede nixir Nybegynder
09. april 2007 - 19:28 #1
Så ... tror jeg har fundet en enkelt fejl selv...

Er ret sikker på jeg benytter en MySQL v. 5.xx.xx ... Derfor er der nogle performance ændringer der betyder man skal være mere præcis i sine joins. Det betyder fx man skal smide en parantes rundt om de forskellige joins. Ved ikke om jeg har gjort det korrekt, men helt beskedent sku jeg mene det er rigtigt - i må meget gerne tjekke:

$query = "SELECT open_day, COUNT(kiosk_id) AS intKiosks, kiosk_name, kiosk_id, zip_city, kiosk_address FROM (jk_kiosks AS k ";
$query .= "JOIN jk_zipcodes AS z ON z.zip_zip=k.kiosk_zip) ";
if($_GET['mode']!='all') {
    $query .= "JOIN jk_openings AS o ON o.kiosk_id=k.kiosk_id AND ";
    $query .= "o.open_day = ".date("N")." AND ";
    $query .= "o.open_from <= ".date("dm")." AND ";
    $query .= "o.open_to >= ".date("dm")." ";
} else {
    $query .= "LEFT JOIN jk_openings AS o ON o.kiosk_id=k.kiosk_id AND ";
    $query .= "o.open_day = ".date("N")." AND ";
    $query .= "o.open_from <= ".date("dm")." AND ";
    $query .= "o.open_to >= ".date("dm")." ";
}
$query .= "WHERE kiosk_zip = ".$_GET['zip']." ";
$query .= "GROUP BY kiosk_name, kiosk_id, zip_city";
Avatar billede nixir Nybegynder
09. april 2007 - 19:29 #2
Det virker btw stadig ikke ...
Avatar billede nixir Nybegynder
09. april 2007 - 23:02 #3
fik langt om længe løst det selv ...
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester