Результаты фильтрации SQL Like или REGEXP, даже когда все должно быть сопоставлено

#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 указано правильно.