Следующий запрос MySQL выполняется в PHP без ошибок, но набор результатов пуст. Непосредственный вывод строки запроса в файл и выполнение запроса в клиенте MySQL с использованием «source [filename]» возвращает несколько строк результатов, как и ожидалось.
Есть ли что-то, что могло бы заставить этот запрос не работать с PHP? categorylinks.cl_to и smw_spec2.value_string являются varbinary (255). Показать таблицу создания указывает engine = InnoDB и charset по умолчанию = двоичный файл.
То, что я пытался безуспешно:
$sql = preg_replace("/[\n\t]+/", " ", $sql);
- Изменение '_wpg' и 'Derp' на
CAST('_wpg' AS BINARY(255))
- Изменение '_wpg' и 'Derp' на
BINARY '_wpg'
Я использую класс MediaWiki DatabaseMysql для выполнения запроса и выборки строк, но это очень тонкая абстракция, и я уверен, что это не проблема (см. Ниже).
SELECT
prop.name AS prop_name, prop.count AS prop_count, prop.type AS prop_type,
val.value AS val_value, val.unit AS val_unit, val.count AS val_count
FROM
(
SELECT
s_id, name, type, COUNT(foo.name) AS count
FROM (
(
SELECT
cl.cl_to AS cat_name, s.smw_id AS s_id, s.smw_sortkey AS name, spec.value_string AS type
FROM `smw_ids` s
INNER JOIN (`categorylinks` cl, `page` p, `smw_ids` s2, `smw_atts2` a)
ON (cl.cl_from = p.page_id AND
p.page_title = s2.smw_title AND
s2.smw_id = a.s_id AND
a.p_id = s.smw_id)
LEFT JOIN `smw_spec2` spec ON s.smw_id = spec.s_id
)
UNION ALL
(
SELECT
cl.cl_to AS cat_name, s.smw_id AS s_id, s.smw_sortkey AS name, '_wpg' AS type
FROM `smw_ids` s
INNER JOIN (`categorylinks` cl, `page` p, `smw_ids` s2, `smw_rels2` a)
ON (cl.cl_from = p.page_id AND
p.page_title = s2.smw_title AND
s2.smw_id = a.s_id AND
a.p_id = s.smw_id)
)
) AS foo
WHERE foo.cat_name = 'Derp'
GROUP BY name
ORDER BY count DESC
LIMIT 10
) AS prop
INNER JOIN
(
SELECT
bar.p_id AS p_id, bar.value AS value, bar.unit AS unit, COUNT(bar.value) AS count,
IF( @prev != p_id, @rownum := 1, @rownum := @rownum+1 ) AS rank,
@prev := p_id
FROM (
(SELECT a.p_id AS p_id, a.value_xsd AS value, a.value_unit AS unit FROM `smw_atts2` a)
UNION ALL
(SELECT r.p_id AS p_id, s.smw_sortkey AS value, NULL AS unit
FROM `smw_rels2` r INNER JOIN `smw_ids` s ON r.o_id = s.smw_id)
) AS bar
GROUP BY value, unit
ORDER BY count DESC
) AS val
ON prop.s_id = val.p_id
WHERE val.rank <= 50
ORDER BY prop_count DESC, prop_name, val_count DESC, val_value
Редактировать: следующий тестовый скрипт ничего не выводит. query.sql содержит в точности приведенный выше запрос, записанный в файл, непосредственно предшествующий вызову mysql_query () в классе базы данных MediaWiki.
$db = mysql_connect('localhost', 'root', '');
mysql_select_db('mediawiki', $db);
$res = mysql_query(file_get_contents("query.sql"), $db);
while ($row = mysql_fetch_assoc($res)) {
var_dump($row);
}
echo mysql_error($db);
Редактировать: я импортировал огромный дамп базы данных, и после этого, когда я загрузил страницу PHP, было заметное ожидание, которое, казалось, указывало на то, что запрос выполнялся, но результаты все равно не показывались. Я закончил доработку запроса, и у меня больше нет этой проблемы.