即使所有内容都应匹配,SQL Like或REGEXP也会过滤结果

时间:2011-04-12 12:25:52

标签: mysql sql-like

这就是我所拥有的

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

有了这些条件,我会假设这给出了相同的结果:

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这样做)并且具有完全相同的属性。

BTW 我注意到使用LIKE而不是REGEXP时的行为相同。

2 个答案:

答案 0 :(得分:1)

这可能是由某些行中的NULL值引起的。与其他值比较时,NULL字段将计算为False。

如果您想通过第二个查询获取所有值,请将WHERE子句中与product-table相关的表达式移到您的加入条件中,这样您最终得到:

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条记录。

答案 1 :(得分:1)

由于您有LEFT JOIN,因此您还可以获得product.field_sockel_valueproduct.field_licht_farbe_valueNULL的行。这些行已在WHERE子句

中过滤掉