#mysql #sql-like
#mysql #sql-подобный
Вопрос:
это то, что у меня есть
SELECT node.nid AS nid, node.type AS node_type, product.*
FROM ml_node node
LEFT JOIN ml_content_type_product product
ON node.vid = product.vid
WHERE (node.type in('product'))
AND product.field_sockel_value REGEXP '.*'
AND product.field_artikel_value REGEXP '.*'
AND product.field_leistung_value REGEXP '.*'
AND product.field_licht_farbe_value REGEXP '.*'
AND product.field_rubrik_value REGEXP '.*'
AND product.field_artikelgruppe_value REGEXP '.*'
ORDER BY product.field_artikel_value
Имея эти where-условия, я бы предположил, что это дает те же результаты, что и:
SELECT node.nid AS nid, node.type AS node_type, product.*
FROM ml_node node
LEFT JOIN ml_content_type_product product
ON node.vid = product.vid
WHERE (node.type in('product'))
ORDER BY product.field_artikel_value
Но это не так. Первая возвращает 494 строки, а последняя — 717. Итак, не хватает нескольких строк. Когда я использую этот запрос
SELECT node.nid AS nid, node.type AS node_type, product.*
FROM ml_node node
LEFT JOIN ml_content_type_product product
ON node.vid = product.vid
WHERE (node.type in('product'))
AND product.field_artikel_value REGEXP '.*'
AND product.field_leistung_value REGEXP '.*'
AND product.field_rubrik_value REGEXP '.*'
AND product.field_artikelgruppe_value REGEXP '.*'
ORDER BY product.field_artikel_value
Я также получаю 717 строк. Итак … что может быть такого, что делает эти удаленные условия такими особенными? Все столбцы имеют тип longtext (потому что cms делает это) и имеют точно такие же атрибуты.
КСТАТИ, я заметил такое же поведение при использовании LIKE вместо REGEXP.
Комментарии:
1. Я добавил некоторую дополнительную информацию к своему ответу, чтобы, надеюсь, дать вам то, что вам нужно, — на основе вашего комментария под ответом Ocaso.
Ответ №1:
Поскольку у вас есть LEFT JOIN
, вы также получаете строки, где product.field_sockel_value
или product.field_licht_farbe_value
является NULL
. Эти строки были отфильтрованы в WHERE
предложении
Комментарии:
1. Как мне также получить эти строки?
2. Просто добавьте
OR product.field_sockel_value IS NULL
и так далее для каждого столбца:AND (product.field_sockel_value REGEXP '.*' OR product.field_sockel_value IS NULL)
Ответ №2:
Это может быть вызвано нулевыми значениями в определенных строках. Нулевое поле будет равно False при сравнении с другим значением.
Если вы хотите вернуть все значения с помощью вашего второго запроса, переместите выражения, связанные с таблицей продуктов, в WHERE
предложении в ваши критерии объединения, чтобы в итоге получить:
SELECT node.nid AS nid, node.type AS node_type, product.*
FROM ml_node node
LEFT JOIN ml_content_type_product product
ON node.vid = product.vid
AND product.field_sockel_value REGEXP '.*'
AND product.field_artikel_value REGEXP '.*'
AND product.field_leistung_value REGEXP '.*'
AND product.field_licht_farbe_value REGEXP '.*'
AND product.field_rubrik_value REGEXP '.*'
AND product.field_artikelgruppe_value REGEXP '.*'
WHERE (node.type in('product'))
ORDER BY product.field_artikel_value
Это гарантирует, что объединение будет выполнено только тогда, когда оно соответствует вашим другим критериям, но все равно вернет все ваши node
записи, где type
указано правильно.