Как написать этот подзапрос MySQL для выбора строк, имеющих общее значение и одно известное значение

#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, и теперь, похоже, все работает, как и ожидалось. Спасибо!