Dubbele query met taal keuze [OPGELOST]
Indien ze dit niet willen gaat wordt er een standaard tijds aanduiding gegeven, 0000-00-00 00:00:00
Nu werkt dit op zich goed. Alleen als ik een bepaalde taal maar wil tonen gaat het mis.
Ik werk met Codeigniter en active record queries. Desalniettemin kan ik gewoon normale queries gebruiken of een combo hiervan.
Onderstaand de query en het resultaat hiervan in objecten.
Ik kom er niet meer uit.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
SELECT `news_id`, `news_publishdate`, `news_startdate`, `news_enddate`, `news_order_id`, `news_status`, `news_posterid`, `news_tags`, `news_translation_id`, `news_translation_intro_title`, `news_translation_intro_text`, `news_translation_intro_image`, `news_translation_detail_title`, `news_translation_detail_text`, `news_translation_detail_image`, `news_translation_newsid`, `news_translation_localeid`, `locale_id`, `locale_code`, `locale_name`, `locale_active`
FROM (`module_news`)
JOIN `module_news_translations` ON `module_news_translations`.`news_translation_newsid` = `module_news`.`news_id`
JOIN `locales` ON `locales`.`locale_id` = `module_news_translations`.`news_translation_localeid`
WHERE `news_startdate` <= '2014-08-11 00:00:00' AND news_enddate >= '2014-08-11 00:00:00'
OR `news_startdate` = '0000-00-00 00:00:00' OR news_enddate = '0000-00-00 00:00:00'
AND `news_translation_localeid` = '1'
AND `locale_id` = '1'
AND `news_status` = '1'
ORDER BY `news_order_id` ASC
LIMIT 10
Array
(
[0] => stdClass Object
(
[news_id] => 4
[news_publishdate] => 2014-05-21 00:00:00
[news_startdate] => 0000-00-00 00:00:00
[news_enddate] => 0000-00-00 00:00:00
[news_order_id] => 2
[news_status] => 1
[news_posterid] => 1
[news_tags] =>
[news_translation_id] => 5
[news_translation_intro_title] => item 1
[news_translation_intro_text] => Item 1
[news_translation_intro_image] =>
[news_translation_detail_title] => Item 1
[news_translation_detail_text] => Item 1
[news_translation_detail_image] =>
[news_translation_newsid] => 4
[news_translation_localeid] => 1
[locale_id] => 1
[locale_code] => nl_NL
[locale_name] => Dutch
[locale_active] => 1
)
[1] => stdClass Object
(
[news_id] => 4
[news_publishdate] => 2014-05-21 00:00:00
[news_startdate] => 0000-00-00 00:00:00
[news_enddate] => 0000-00-00 00:00:00
[news_order_id] => 2
[news_status] => 1
[news_posterid] => 1
[news_tags] =>
[news_translation_id] => 6
[news_translation_intro_title] => Item 1
[news_translation_intro_text] => Item 1
[news_translation_intro_image] =>
[news_translation_detail_title] => News item 1
[news_translation_detail_text] => ''
[news_translation_detail_image] =>
[news_translation_newsid] => 4
[news_translation_localeid] => 2
[locale_id] => 2
[locale_code] => en_GB
[locale_name] => English
[locale_active] => 1
)
)
FROM (`module_news`)
JOIN `module_news_translations` ON `module_news_translations`.`news_translation_newsid` = `module_news`.`news_id`
JOIN `locales` ON `locales`.`locale_id` = `module_news_translations`.`news_translation_localeid`
WHERE `news_startdate` <= '2014-08-11 00:00:00' AND news_enddate >= '2014-08-11 00:00:00'
OR `news_startdate` = '0000-00-00 00:00:00' OR news_enddate = '0000-00-00 00:00:00'
AND `news_translation_localeid` = '1'
AND `locale_id` = '1'
AND `news_status` = '1'
ORDER BY `news_order_id` ASC
LIMIT 10
Array
(
[0] => stdClass Object
(
[news_id] => 4
[news_publishdate] => 2014-05-21 00:00:00
[news_startdate] => 0000-00-00 00:00:00
[news_enddate] => 0000-00-00 00:00:00
[news_order_id] => 2
[news_status] => 1
[news_posterid] => 1
[news_tags] =>
[news_translation_id] => 5
[news_translation_intro_title] => item 1
[news_translation_intro_text] => Item 1
[news_translation_intro_image] =>
[news_translation_detail_title] => Item 1
[news_translation_detail_text] => Item 1
[news_translation_detail_image] =>
[news_translation_newsid] => 4
[news_translation_localeid] => 1
[locale_id] => 1
[locale_code] => nl_NL
[locale_name] => Dutch
[locale_active] => 1
)
[1] => stdClass Object
(
[news_id] => 4
[news_publishdate] => 2014-05-21 00:00:00
[news_startdate] => 0000-00-00 00:00:00
[news_enddate] => 0000-00-00 00:00:00
[news_order_id] => 2
[news_status] => 1
[news_posterid] => 1
[news_tags] =>
[news_translation_id] => 6
[news_translation_intro_title] => Item 1
[news_translation_intro_text] => Item 1
[news_translation_intro_image] =>
[news_translation_detail_title] => News item 1
[news_translation_detail_text] => ''
[news_translation_detail_image] =>
[news_translation_newsid] => 4
[news_translation_localeid] => 2
[locale_id] => 2
[locale_code] => en_GB
[locale_name] => English
[locale_active] => 1
)
)
Zodra je in de WHERE clause gebruik maakt van AND en OR zonder via haakjes aan te geven hoe die moeten worden uitgevoerd dan vraag je om problemen. Ik durf bijna te wedden dat mysql tot een heel andere volgorde komt dan dat jij wilt.
Wat ik wil is alleen de artikelen van een bepaalde taal worden getoond.
Maar dan mag de starttijd niet hoger zijn dan nu en de eindtijd wel of gelijk aan.
OF
Er is helemaal geen datum ingevuld (oftewel 0000-00-00 00:00:00)
Kan je me erbij helpen of een voorbeeld geven? Ik weet niet hoe ik haakjes in de query moet verwerken.
Alvast bedankt.
dat formaat levert alleen maar problemen op: 0000-00-00 is kleiner dan 2014-08-11 en dus zou er niet getoond moeten worden. Je moet dus allemaal aanpassingen doen om de uitzondering te verwerken.
daarbij is het ook geen geldige datum natuurlijk.
Het is veel handiger om indien niet geset de "waarde" NULL te noteren.
Toevoeging op 11/08/2014 15:36:12:
Rick de Graaff op 11/08/2014 15:34:08:
Oke ik ga dat dan even proberen. Ik kom er nog op terug! Ga gelijk aan de gang.
Daar heb je het eerste probleem al. Ik gebruik een date-time. Hier kan ik geen NULL opgeven, alleen maar een datum of de 0000-00-00 00:00:00 notatie
De haakjes gebruik je om aan te geven welke operator als eerste uitgevoerd moet worden. AND wordt door mysql eerst uitgevoerd, daarna pas een OR. Wat je nu hebt wordt dus:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
WHERE `news_startdate` <= '2014-08-11 00:00:00' AND news_enddate >= '2014-08-11 00:00:00'
OR `news_startdate` = '0000-00-00 00:00:00' OR news_enddate = '0000-00-00 00:00:00'
AND `news_translation_localeid` = '1'
AND `locale_id` = '1'
AND `news_status` = '1'
is gelijk aan:
WHERE (`news_startdate` <= '2014-08-11 00:00:00' AND news_enddate >= '2014-08-11 00:00:00')
OR
`news_startdate` = '0000-00-00 00:00:00'
OR
(news_enddate = '0000-00-00 00:00:00' AND `news_translation_localeid` = '1' AND `locale_id` = '1' AND `news_status` = '1')
OR `news_startdate` = '0000-00-00 00:00:00' OR news_enddate = '0000-00-00 00:00:00'
AND `news_translation_localeid` = '1'
AND `locale_id` = '1'
AND `news_status` = '1'
is gelijk aan:
WHERE (`news_startdate` <= '2014-08-11 00:00:00' AND news_enddate >= '2014-08-11 00:00:00')
OR
`news_startdate` = '0000-00-00 00:00:00'
OR
(news_enddate = '0000-00-00 00:00:00' AND `news_translation_localeid` = '1' AND `locale_id` = '1' AND `news_status` = '1')
Ik denk dat je wil:
Code (php)
1
2
3
4
2
3
4
WHERE (`news_startdate` <= '2014-08-11 00:00:00' AND news_enddate >= '2014-08-11 00:00:00' OR `news_startdate` = '0000-00-00 00:00:00' OR news_enddate = '0000-00-00 00:00:00')
AND `news_translation_localeid` = '1'
AND `locale_id` = '1'
AND `news_status` = '1'
AND `news_translation_localeid` = '1'
AND `locale_id` = '1'
AND `news_status` = '1'
En dan heb je meteen je haakjes.
Ik kan echt geen NULL waarde opgeven. Ik gebruik Navicat om mijn database te beheren maar het lukt echt niet. Toch heb ik je advies opgevolgd en gekeken of ik iets kon bereiken met de voorbeelden die je gaf.
Uiteindelijke heeft dit het gedaan! :D
Code (php)
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
SELECT `news_id`, `news_publishdate`, `news_startdate`, `news_enddate`, `news_order_id`, `news_status`, `news_posterid`, `news_tags`, `news_translation_id`, `news_translation_intro_title`, `news_translation_intro_text`, `news_translation_intro_image`, `news_translation_detail_title`, `news_translation_detail_text`, `news_translation_detail_image`, `news_translation_newsid`, `news_translation_localeid`, `locale_id`, `locale_code`, `locale_name`, `locale_active`, `cmsu_id`, `cmsu_username`, `cmsu_emailaddress`, `cmsu_firstname`, `cmsu_lastname`
FROM (`module_news`)
JOIN `module_news_translations` ON `module_news_translations`.`news_translation_newsid` = `module_news`.`news_id`
JOIN `locales` ON `locales`.`locale_id` = `module_news_translations`.`news_translation_localeid`
JOIN `cms_users` ON `cms_users`.`cmsu_id` = `module_news`.`news_posterid`
WHERE (news_startdate <= '2014-08-11 00:00:00' AND news_enddate >= '2014-08-11 00:00:00' OR news_startdate = '0000-00-00 00:00:00' OR news_enddate = '0000-00-00 00:00:00')
AND `news_translation_localeid` = '1'
AND `locale_id` = '1'
AND `news_status` = '1'
ORDER BY `news_order_id` ASC
LIMIT 10
FROM (`module_news`)
JOIN `module_news_translations` ON `module_news_translations`.`news_translation_newsid` = `module_news`.`news_id`
JOIN `locales` ON `locales`.`locale_id` = `module_news_translations`.`news_translation_localeid`
JOIN `cms_users` ON `cms_users`.`cmsu_id` = `module_news`.`news_posterid`
WHERE (news_startdate <= '2014-08-11 00:00:00' AND news_enddate >= '2014-08-11 00:00:00' OR news_startdate = '0000-00-00 00:00:00' OR news_enddate = '0000-00-00 00:00:00')
AND `news_translation_localeid` = '1'
AND `locale_id` = '1'
AND `news_status` = '1'
ORDER BY `news_order_id` ASC
LIMIT 10
probeer je NULL op te slaan, of 'NULL' (een string van 4 letters)?
Rick de Graaff op 11/08/2014 15:56:23:
@erwin -
Ik kan echt geen NULL waarde opgeven. Ik gebruik Navicat om mijn database te beheren maar het lukt echt niet.
Ik kan echt geen NULL waarde opgeven. Ik gebruik Navicat om mijn database te beheren maar het lukt echt niet.
Spijt me, maar het blijft onzin. Een datetime type in mysql heeft geen NULL restrictie erop zitten, dus je kan wel degelijk de waarde NULL invoeren. Dat je bepaalde tools hebt die dat blijkbaar niet kunnen, of je een verkeerd script gebruikt doet daar niets aan af. Lijkt me meer dat er via een bepaald tool een NOT NULL definitie op de kolom wordt gezet, maar dat nogmaals, is iets dat je dan zelf doet.
Ivo P op 11/08/2014 15:33:18:
0000-00-00
dat formaat levert alleen maar problemen op: 0000-00-00 is kleiner dan 2014-08-11 en dus zou er niet getoond moeten worden. Je moet dus allemaal aanpassingen doen om de uitzondering te verwerken.
daarbij is het ook geen geldige datum natuurlijk.
Het is veel handiger om indien niet geset de "waarde" NULL te noteren.
dat formaat levert alleen maar problemen op: 0000-00-00 is kleiner dan 2014-08-11 en dus zou er niet getoond moeten worden. Je moet dus allemaal aanpassingen doen om de uitzondering te verwerken.
daarbij is het ook geen geldige datum natuurlijk.
Het is veel handiger om indien niet geset de "waarde" NULL te noteren.
Dat 0000-00-00 geen geldig datum is heb je gelijk in, maar:
Dus of het nu veel handiger is om een nullable kolom te hebben valt te bezien.
Quote:
@erwin -
Ik kan echt geen NULL waarde opgeven. Ik gebruik Navicat om mijn database te beheren maar het lukt echt niet. Toch heb ik je advies opgevolgd en gekeken of ik iets kon bereiken met de voorbeelden die je gaf.
Ik kan echt geen NULL waarde opgeven. Ik gebruik Navicat om mijn database te beheren maar het lukt echt niet. Toch heb ik je advies opgevolgd en gekeken of ik iets kon bereiken met de voorbeelden die je gaf.
Zit dat probleem in Navicat of in je mysql server configuratie?
Als ik zo even in de handleiding zit te lezen kan je die optie afdwingen dat een datum 0000-00-00 een mooie error geeft. Ik dacht eerst dat de benaming strict modes was.
Effin, hier heb je de link om zelf eens te kijken of je mysql een fine tune kunt geven. ;)
http://dev.mysql.com/doc/refman/5.0/en/sql-mode.html
Edit, hier zit het allemaal wat beknopter verweven mocht je geen zin hebben om alles door te nemen in de manual. http://www.pfz.nl/wiki/werken-met-mysql/#configuratie-sql-modes
Gewijzigd op 11/08/2014 20:01:50 door Bart V B
Ik denk dat het een "fout" is in Navicat. Wat ik invoer is gewoon NULL, ik denk dat dit wordt gezien al string en niet als NULL waarde maar als 'NULL'.
Daarnaast ga ik de MySQL ref. even bekijken en doorlezen, hier steek ik natuurlijk nog weer wat van op.
Toch vindt ik Erwin zijn reactie erg bot, het is niet dat ik het niet probeerde het was dus meer een onkunde van mijn beheer-tool. PHPmyAdmin heb ik ook maar had dat niet geprobeerd omdat ik andere dingen aan het doen was op dat bepaalde moment.
Al met al is het gelukt.
Ik zeg, topic dicht.
Het is ook niet dat ik hier nu op reageer om je te bekeren tot wat wij zeggen "zo moet het".
Las het topic door, en had ooit in een talk gehoord over die vreemde datums en nog wat ongein wat mysql allemaal kan. Dus dacht in eerste instantie aan strict modes, dus denk zal even voor je meedenken hoe dat ook alweer zat.
Overigens in phpmyadmin heb je dit "probleem" ook. Als je je mysql server al die dingen,laten we zeggen minder exotisch instelt, dan kom je later niet voor vreemde verrassingen te staan. Nogmaals geen bashing richting mysql, ook niet een overtuiging verhaal dat het allemaal beter moet, maar meer een tip dat het beter kan. ;)
Ik ben zo blij als een vogel met een werkende module.
Wat er gebeurd bij een NULL invoer op een kolom die niet nullable is:
- als er een default waarde is hou die aan
- genereer een fout als geen default waarde is ingesteld
Ook als je bij een nullable column een default waarde hebt toegevoegd wordt die ingevoerd als NULL wordt ingevoerd.
Erwin zijn reactie is (zelfs) niet (een beetje) bot, maar gewoon recht dooruit:
Ik kan me niet voorstellen dat Navicat afdwingt dat kolommen not nullable zijn danwel een verplichte default hebben
Gewijzigd op 11/08/2014 23:36:54 door Erwin H
Eind goed al goed.