mark: mysql - Warum funktioniert Abfrage in ON aber nicht in WHERE

Beitrag lesen

Hallo Rolf,

hmmm ... ich übersehe da etwas ... dein Beispiel funktioniert bei mir auch! Aber ich sehe den Unterschied zwischen deinem und meinem Beispiel nicht.

Ich habe nun ein POC zusammengebastelt mit meinen Daten. Hier tritt der "Fehler" auf. Könntest du das bitte ausführen und den output verifizieren?

-- define temporary available lang
DROP TEMPORARY TABLE IF EXISTS available_lang;
CREATE TEMPORARY TABLE IF NOT EXISTS `available_lang` (
      locale VARCHAR(6) DEFAULT NULL
);
INSERT INTO available_lang (locale) VALUES ('de_DE'),('en_US'),('it_IT'),('fr_FR');

-- define temporary i18n_test
DROP TEMPORARY TABLE IF EXISTS i18n_test;
CREATE TEMPORARY TABLE IF NOT EXISTS `i18n_test` (
      id VARCHAR(36),
      locale VARCHAR(6) DEFAULT NULL,
      foreign_key VARCHAR(36) DEFAULT NULL,
      `text` MEDIUMTEXT
);
INSERT INTO `i18n_test` (`id`, `locale`, `foreign_key`, `text`) VALUES ('84285a7a-2147-4c2d-94df-5ff2754c4033', 'en_US', 'cc0d1b70-637d-4f1f-89e5-2d74f26226f5', 'other');
INSERT INTO `i18n_test` (`id`, `locale`, `foreign_key`, `text`) VALUES ('b28f3622-5480-4c52-8356-e476e897c991', 'de_DE', 'cc0d1b70-637d-4f1f-89e5-2d74f26226f5', 'andere');
INSERT INTO `i18n_test` (`id`, `locale`, `foreign_key`, `text`) VALUES ('b58a1117-01dd-450b-8526-223bb7e8b525', 'it_IT', 'cc0d1b70-637d-4f1f-89e5-2d74f26226f5', 'altro');


-- query with join
SELECT
	available_lang.locale AS available_locale
	, i18n_test.id
	, i18n_test.foreign_key
	, i18n_test.locale AS i18n_locale
	, i18n_test.`text`
	
	FROM available_lang 
	LEFT JOIN  i18n_test
		ON i18n_test.locale = available_lang.locale
		AND i18n_test.foreign_key = 'cc0d1b70-637d-4f1f-89e5-2d74f26226f5';


		
-- query with where
SELECT
	available_lang.locale AS available_locale
	, i18n_test.id
	, i18n_test.foreign_key
	, i18n_test.locale AS i18n_locale
	, i18n_test.`text`
	
	FROM available_lang 
	LEFT JOIN  i18n_test
		ON i18n_test.locale = available_lang.locale

WHERE i18n_test.foreign_key = 'cc0d1b70-637d-4f1f-89e5-2d74f26226f5'
	OR i18n_test.foreign_key = NULL;

Ergebnis erstes Query (JOIN):

available_locale id foreign_key i18n_locale text
en_US 84285a7a-2147-4c2d-94df-5ff2754c4033 cc0d1b70-637d-4f1f-89e5-2d74f26226f5 en_US other
de_DE b28f3622-5480-4c52-8356-e476e897c991 cc0d1b70-637d-4f1f-89e5-2d74f26226f5 de_DE andere
it_IT b58a1117-01dd-450b-8526-223bb7e8b525 cc0d1b70-637d-4f1f-89e5-2d74f26226f5 it_IT altro
fr_FR \N \N \N \N

Ergebnis zweites Query (WHERE fr_FR fehlt):

available_locale id foreign_key i18n_locale text
de_DE b28f3622-5480-4c52-8356-e476e897c991 cc0d1b70-637d-4f1f-89e5-2d74f26226f5 de_DE andere
en_US 84285a7a-2147-4c2d-94df-5ff2754c4033 cc0d1b70-637d-4f1f-89e5-2d74f26226f5 en_US other
it_IT b58a1117-01dd-450b-8526-223bb7e8b525 cc0d1b70-637d-4f1f-89e5-2d74f26226f5 it_IT altro