#php #mysql #subquery
Вопрос:
Если у меня есть таблица с двумя строками, которые имеют общее значение. Я знаю «известное значение» и пытаюсь получить (неизвестное) значение. Настройка выглядит следующим образом:
----------- ------------ ----------------
| post_id | meta_key | meta_value |
----------- ------------ ----------------
| 20 | 'key_1' | (unknown) |
----------- ------------ ----------------
| 20 | 'key_2' | 'known_value' |
----------- ------------ ----------------
Я пытаюсь написать один подзапрос, который выполнит это, но он не работает:
$sql = "SELECT `meta_value` FROM `my_table` WHERE `meta_key` = 'key_1' AND `post_id` = (SELECT `post_id` FROM `my_table` WHERE `meta_key` = 'key_2' AND `meta_value` = %s)";
$sql = $wpdb->prepare( $sql, array( 'known_value' ) );
$result = $wpdb->get_var($sql);
Я могу заставить его работать, если напишу его в два этапа, вот так:
$sql = "SELECT `post_id` FROM `my_table` WHERE `meta_key` = 'key_2' AND `meta_value` = %s";
$sql = $wpdb->prepare( $sql, array( 'known_value ) );
$post_id = $wpdb->get_var($sql);
// this gets the post_id of 20
$sql = "SELECT `meta_value` FROM `my_table` WHERE `meta_key` = 'key_1' AND `post_id` = %d";
$sql = $wpdb->prepare( $sql, array( $post_id) );
$result = $wpdb->get_var($sql);
// this gets the (unknown) value
Как мне написать его за один шаг с помощью подзапроса? Заранее спасибо за вашу помощь.
Комментарии:
1. Ваш запрос работает: sqlfiddle.com/#!9/e76cba/1
2. Может ли быть более одной строки с
meta_key = key_2
иmeta_value = known_value
? Если подзапрос может возвращать более одногоpost_id
, вам нужно использоватьIN
вместо=
этого .3. Я думаю, что в этом и была проблема. Я сменил = на IN, и теперь, похоже, все работает, как и ожидалось. Спасибо!