Hjälp med SQL-fråga

Tråden skapades och har fått 6 svar. Det senaste inlägget skrevs .
1
  • Medlem
  • Stockholm
  • 2006-11-13 11:03

Hej,

Jag förstår inte varför dessa två frågor ger olika resultat. Någon som kan förklara?

SELECT a.* , c.name AS county_name, i.name AS industry_name, m.name AS municipality_name
FROM ads a
LEFT JOIN counties c ON a.county_id = c.id
LEFT JOIN industries i ON a.industry_id = i.id
LEFT JOIN municipalities m ON a.municipality_id = m.id
WHERE date_expires >1163411367
AND visible =  'Y'
AND confirmed =  'Y'
AND type_id =  '2'
ORDER BY date_confirmed DESC , date_created DESC 
LIMIT 3

SELECT a.id , c.name AS county_name, i.name AS industry_name, m.name AS municipality_name
FROM ads a
LEFT JOIN counties c ON a.county_id = c.id
LEFT JOIN industries i ON a.industry_id = i.id
LEFT JOIN municipalities m ON a.municipality_id = m.id
WHERE date_expires >1163411367
AND visible =  'Y'
AND confirmed =  'Y'
AND type_id =  '2'
ORDER BY date_confirmed DESC , date_created DESC 
LIMIT 3

Jag förstår inte riktigt hur det hänger ihop. Någon som kan förklara för mig snälla?
Vh ivar

ps .Så här ser ads ut

CREATE TABLE `ads` (
  `id` int(11) NOT NULL auto_increment,
  `type_id` tinyint(2) default NULL,
  `owner_id` smallint(5) NOT NULL default '0',
  `confirmed` enum('Y','N') NOT NULL default 'N',
  `visible` enum('Y','N') NOT NULL default 'Y',
  `header` varchar(100) NOT NULL default '',
  `description` text NOT NULL,
  `date_created` int(11) NOT NULL default '0',
  `date_expires` int(11) NOT NULL default '0',
  `date_modified` int(11) NOT NULL default '0',
  `date_confirmed` int(11) NOT NULL default '0',
  `industry_id` smallint(3) NOT NULL default '0',
  `county_id` smallint(3) NOT NULL default '0',
  `municipality_id` smallint(3) NOT NULL default '0',
  `result` enum('+','-','?') NOT NULL default '?',
  `turnover_min` int(6) NOT NULL default '0',
  `turnover_max` int(6) NOT NULL default '0',
  `num_views` int(6) NOT NULL default '0',
  `num_contacts` smallint(5) NOT NULL default '0',
  `comment` text NOT NULL,
  `num_employees_min` int(5) NOT NULL default '0',
  `num_employees_max` int(5) NOT NULL default '0',
  PRIMARY KEY  (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 ;
...
LEFT JOIN counties c ON a.county_id = c.id
LEFT JOIN industries i ON a.industry_id = i.id
LEFT JOIN municipalities m ON a.municipality_id = m.id
WHERE date_expires >1163411367
AND visible =  'Y'
AND confirmed =  'Y'
AND type_id =  '2'
ORDER BY date_confirmed DESC , date_created DESC 
LIMIT 3

Vad jag kan se är urvalskriterierna likadana, och därför borde de inte generera olika URVAL.

Däremot kommer listan av kolumner som du väljer ut skilja sig, då du i den första frågan väljer ut alla kolumner från ads

SELECT a.*, ...

medan du i den andra frågan endast visar id-kolumnen

SELECT a.id, ...
  • Medlem
  • Stockholm
  • 2006-11-13 12:05

Ja men exakt... problemet är att jag faktiskt får olika rader som resultat...

Det enda jag kan tänka mig då är att kolumnnamnen i urvalskriteriet (WHERE satsen) kanske kolliderar med namn i andra tabeller, så att du t.ex. i den första frågan gör urval från ads (a.* är angivet så alla kolumner finns i queryn) medan du i andra frågan får dessa/någon av dessa kolumner från joinade tabeller (countries, industries, municipalities).

Testa att specificera nogrannare i WHERE satsen vilka kolumner det handlar om (lägg till a. framför varje kolumnnamn) och se om det förändrar något.

/J

  • Medlem
  • Stockholm
  • 2006-11-13 13:03

edit:

Tror jag hittade lösningen nu!

Varför det blir olika sökträffar är något jag inte exakt förstår men jag märkte att i min testdatabas så hade alla annonserna samma date_created och date_confirmed, jag lade till att om den behövde så skulle den även sortera i tredje hand efter annons-id:t och då fick jag samma sökträffar för de båda frågorna

  • Medlem
  • Kiruna
  • 2006-11-13 13:51

Anledningen är helt enkelt att du sorterar på fält som inte är unika. SQL garanterar inte någon specifik ordning i sådana fall (oftast blir det i den ordning som tuplerna ligger på eller hämtas från disk, beroende på vilken plan som används), men för att få förutsägbara och konsistenta resultat krävs att man sorterar efter ett unikt fält (ex. som i ditt fall: primärnyckeln.)

  • Medlem
  • Stockholm
  • 2006-11-13 14:00

Där har vi det!!

Stort tack för hjälpen Johan och "spot"

1
Bevaka tråden