MySQL – Operand dovrebbe contenere 1 colonna (e)

Durante il lavoro su un sistema che sto creando, ho tentato di utilizzare la seguente query nel mio progetto:

SELECT topics.id, topics.name, topics.post_count, topics.view_count, COUNT( posts.solved_post ) AS solved_post, (SELECT users.username AS posted_by, users.id AS posted_by_id FROM users WHERE users.id = posts.posted_by) FROM topics LEFT OUTER JOIN posts ON posts.topic_id = topics.id WHERE topics.cat_id = :cat GROUP BY topics.id 

“: cat” è associato al mio codice PHP mentre sto usando PDO. 2 è un valore valido per “: cat”.

Quella query però mi dà un errore: “# 1241 – Operand dovrebbe contenere 1 colonna (s)”

Ciò che mi ostacola è che penserei che questa query non avrebbe funzionato. Selezionare le colonne, quindi selezionarne altre due da un’altra tabella e continuare da lì. Non riesco a capire quale sia il problema.

C’è una soluzione semplice a questo, o un altro modo per scrivere la mia domanda?

    La sottoquery sta selezionando due colonne, mentre la si utilizza per proiettare una colonna (come parte della clausola SELECT esterna). È ansible selezionare una sola colonna da tale query in questo contesto.

    Potresti invece unirti alla tabella users ; questo ti darà più flessibilità quando scegli le colonne che vuoi dagli users .

     SELECT topics.id, topics.name, topics.post_count, topics.view_count, COUNT( posts.solved_post ) AS solved_post, users.username AS posted_by, users.id AS posted_by_id FROM topics LEFT OUTER JOIN posts ON posts.topic_id = topics.id LEFT OUTER JOIN users ON users.id = posts.posted_by WHERE topics.cat_id = :cat GROUP BY topics.id 

    Questo errore può verificarsi anche se si utilizzano accidentalmente le virgole anziché AND nella clausola ON di un JOIN :

     JOIN joined_table ON (joined_table.column = table.column, joined_table.column2 = table.column2) ^ should be AND, not a comma 
     COUNT( posts.solved_post ) AS solved_post, (SELECT users.username AS posted_by, users.id AS posted_by_id FROM users WHERE users.id = posts.posted_by) 

    Bene, non è ansible ottenere più colonne da una sottoquery del genere. Fortunatamente, la seconda colonna è già posts.posted_by ! Così:

     SELECT topics.id, topics.name, topics.post_count, topics.view_count, posts.posted_by COUNT( posts.solved_post ) AS solved_post, (SELECT users.username AS posted_by_username FROM users WHERE users.id = posts.posted_by) ... 

    Questo errore può verificarsi anche se utilizzi accidentalmente = anziché IN nella clausola WHERE :

    PER ESEMPIO:

     WHERE product_id = (1,2,3);