Kom ihåg mig?
Home Menu

Menu


svår SQL query som måste lösas.

 
Ämnesverktyg Visningsalternativ
Oläst 2013-02-01, 13:48 #1
naak2803 naak2803 är inte uppkopplad
Mycket flitig postare
 
Reg.datum: Jun 2011
Inlägg: 767
naak2803 naak2803 är inte uppkopplad
Mycket flitig postare
 
Reg.datum: Jun 2011
Inlägg: 767
Standard svår SQL query som måste lösas.

hej,

jag har en liten problem som jag måste lösa, har nu suttit i någon timme utan att lyckas..

databasen ser ut på detta vis.

id postnr
1 75000-76000
2 11655-11660
3 77998
4 45770

det jag vill göra är att skriva en query som först kollar ifall cellen innehåller bindestäck, om ja, ska den kolla ifall den finns med i intervallet. om den inte innehåller bindesträck så ska den bara ta det postnummer som matchar.
naak2803 är inte uppkopplad   Svara med citatSvara med citat
Oläst 2013-02-01, 14:01 #2
tartareandesire tartareandesire är inte uppkopplad
Supermoderator
 
Reg.datum: Jan 2004
Inlägg: 11 585
tartareandesire tartareandesire är inte uppkopplad
Supermoderator
 
Reg.datum: Jan 2004
Inlägg: 11 585
Du har lagt upp databasen lite galet, intervall bör du spara i två olika fält. Om du inte kan ändra så får du använda substring (postnumren har alltid samma format) men det blir ingen effektiv fråga.
__________________
Full-stack developer, free for smaller assignments

Senast redigerad av tartareandesire den 2013-02-01 klockan 14:04
tartareandesire är inte uppkopplad   Svara med citatSvara med citat
Oläst 2013-02-01, 14:01 #3
lunarmyss avatar
lunarmys lunarmys är inte uppkopplad
Mycket flitig postare
 
Reg.datum: Apr 2006
Inlägg: 633
lunarmys lunarmys är inte uppkopplad
Mycket flitig postare
lunarmyss avatar
 
Reg.datum: Apr 2006
Inlägg: 633
Frågan är väl, måste databasen verkligen se ut sådär?
lunarmys är inte uppkopplad   Svara med citatSvara med citat
Oläst 2013-02-01, 14:04 #4
naak2803 naak2803 är inte uppkopplad
Mycket flitig postare
 
Reg.datum: Jun 2011
Inlägg: 767
naak2803 naak2803 är inte uppkopplad
Mycket flitig postare
 
Reg.datum: Jun 2011
Inlägg: 767
ja, db måste se ut så, eftersom resten av systemet är byggd så, och tänker inte sätta mig i den koden och rådda om....
naak2803 är inte uppkopplad   Svara med citatSvara med citat
Oläst 2013-02-01, 14:06 #5
lunarmyss avatar
lunarmys lunarmys är inte uppkopplad
Mycket flitig postare
 
Reg.datum: Apr 2006
Inlägg: 633
lunarmys lunarmys är inte uppkopplad
Mycket flitig postare
lunarmyss avatar
 
Reg.datum: Apr 2006
Inlägg: 633
En fullösning vore att ha ett script som gör en kopia på den tabellen och då lägger upp fälten så som de ska vara (för att kunna genomföra en okej sökning).

Annars har jag svårt att tänka mig någon query som löser det du söker..
lunarmys är inte uppkopplad   Svara med citatSvara med citat
Oläst 2013-02-01, 14:10 #6
naak2803 naak2803 är inte uppkopplad
Mycket flitig postare
 
Reg.datum: Jun 2011
Inlägg: 767
naak2803 naak2803 är inte uppkopplad
Mycket flitig postare
 
Reg.datum: Jun 2011
Inlägg: 767
ok tackar för svaret... det var bara det jag ville veta...
trodde jag kunde lösa det endast med hjälp av en query..
naak2803 är inte uppkopplad   Svara med citatSvara med citat
Oläst 2013-02-01, 14:10 #7
lunarmyss avatar
lunarmys lunarmys är inte uppkopplad
Mycket flitig postare
 
Reg.datum: Apr 2006
Inlägg: 633
lunarmys lunarmys är inte uppkopplad
Mycket flitig postare
lunarmyss avatar
 
Reg.datum: Apr 2006
Inlägg: 633
Nu är inte jag SQL-expert.

tartareandesire har kanske någon lösning, som han nämnde ovan?
lunarmys är inte uppkopplad   Svara med citatSvara med citat
Oläst 2013-02-01, 14:23 #8
tartareandesire tartareandesire är inte uppkopplad
Supermoderator
 
Reg.datum: Jan 2004
Inlägg: 11 585
tartareandesire tartareandesire är inte uppkopplad
Supermoderator
 
Reg.datum: Jan 2004
Inlägg: 11 585
Du kan använda substring som sagt var:

Kod:
SELECT * FROM [tabell]
WHERE postnr LIKE '%-%' AND SUBSTR(postnr, 1, 5) <= '75005' AND SUBSTR(postnr, 7, 5) >= '75005'
Du får kombinera den med den vanliga matchningen bara. Det är dock en usel databasstruktur och därav en usel fråga. Kanske gör du bättre i att hantera den biten i PHP-koden istället.

Edit: Det var alltså sql-frågan som var usel, inte din fråga
__________________
Full-stack developer, free for smaller assignments

Senast redigerad av tartareandesire den 2013-02-01 klockan 15:52
tartareandesire är inte uppkopplad   Svara med citatSvara med citat
Oläst 2013-02-01, 22:35 #9
Conny Westh Conny Westh är inte uppkopplad
Klarade millennium-buggen
 
Reg.datum: Aug 2005
Inlägg: 5 166
Conny Westh Conny Westh är inte uppkopplad
Klarade millennium-buggen
 
Reg.datum: Aug 2005
Inlägg: 5 166
Först skapar vi databasstrukturen med DDL-script...
Kod:
delimiter $$

CREATE TABLE `naak2803postnrarea` 
(
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `postnr` varchar(11) NOT NULL,
  PRIMARY KEY (`id`)
) 
ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=latin1$$
Sen fyller vi på med lite testdata...
Kod:
INSERT INTO `wn`.`naak2803PostnrArea` (`id`, `postnr`) VALUES ('1', '75000-76000');
INSERT INTO `wn`.`naak2803PostnrArea` (`id`, `postnr`) VALUES ('2', '11655-11660');
INSERT INTO `wn`.`naak2803PostnrArea` (`id`, `postnr`) VALUES ('3', '77998');
INSERT INTO `wn`.`naak2803PostnrArea` (`id`, `postnr`) VALUES ('4', '45770');
Sen trycker vi in en Stored Procedurei databasen...
Kod:
-- --------------------------------------------------------------------------------
-- Routine DDL
-- Note: comments before and after the routine body will not be stored by the server
-- --------------------------------------------------------------------------------
DELIMITER $$

CREATE PROCEDURE `wn`.`GetPostnrArea`(IN pnr VARCHAR(5))
BEGIN
	SELECT * 
	FROM `wn`.`naak2803PostnrArea`
	WHERE postnr LIKE '%-%'
	AND SUBSTR(postnr, 1, 5) <= pnr
	AND SUBSTR(postnr, 7, 5) >= pnr

	UNION

	SELECT * 
	FROM `wn`.`naak2803PostnrArea`
	WHERE SUBSTR(postnr, 1, 5) = pnr;
END
För attförenkla test så har jag skapat en egen Stored Procedure för att exekvera testerna...
Kod:
delimiter $$

CREATE DEFINER=`root`@`localhost` PROCEDURE `GetPostnrAreaTest`()
BEGIN
	call `wn`.`GetPostnrArea`('75005'); -- Area 1 75000-76000
	call `wn`.`GetPostnrArea`('11657'); -- Area 2 11655-11660
	call `wn`.`GetPostnrArea`('77998'); -- Area 3 77998
	call `wn`.`GetPostnrArea`('45770'); -- Area 4 45770
	call `wn`.`GetPostnrArea`('55555'); -- No area

	SELECT 'Tartaren' as code, x.* 
	FROM wn.naak2803PostnrArea x
	WHERE postnr LIKE '%-%'
	AND SUBSTR(postnr, 1, 5) <= '75005'
	AND SUBSTR(postnr, 7, 5) >= '75005';
END$$
Sen kör vi testrutinen...
Kod:
call `wn`.`GetPostnrAreaTest`();
Om jag fattat trådskaparens problemdefinition rätt så löser proceduren problemet. Tartaren hade inte med de enstaka postnrummren i sin lösning, jag kompletterade med det, om det nu är det som är meningen att de ska med. Det är andra selecten i UNIONen i proceduren som löser detta problem.

Jag har utgått från tartarens grundlösning och kompletterat den efter vad jag tror är den fullkomliga lösningen av problemdefinitionen.

Jag håller dock med Tartaren och andra i tråden om att datamodellen inte är normaliserad ens med 1NF (Första normalformen) då postnr-kolumnen inte är atomär. Det i sig gör det extremt svårt att bygga en effektiv lösning. Risken för bristande datakvalitet är uppenbar.

Senast redigerad av Conny Westh den 2013-02-01 klockan 22:40
Conny Westh är inte uppkopplad   Svara med citatSvara med citat
Svara


Aktiva användare som för närvarande tittar på det här ämnet: 1 (0 medlemmar och 1 gäster)
 

Regler för att posta
Du får inte posta nya ämnen
Du får inte posta svar
Du får inte posta bifogade filer
Du får inte redigera dina inlägg

BB-kod är
Smilies är
[IMG]-kod är
HTML-kod är av

Forumhopp


Alla tider är GMT +2. Klockan är nu 19:31.

Programvara från: vBulletin® Version 3.8.2
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Svensk översättning av: Anders Pettersson
 
Copyright © 2017