Результаты SQL Like или REGEXP получаются даже тогда, когда все должно совпадать - PullRequest
0 голосов
/ 12 апреля 2011

это то, что у меня есть

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.

Ответы [ 2 ]

1 голос
/ 12 апреля 2011

Поскольку у вас есть LEFT JOIN, вы также получите строки, где product.field_sockel_value или product.field_licht_farbe_value равно NULL. Эти строки были отфильтрованы в WHERE предложении

1 голос
/ 12 апреля 2011

Это может быть вызвано значениями NULL в определенных строках. Поле NULL будет иметь значение 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 является правильным.

...