wake-up-neo.com

MySQL WHERE <mehrspaltig> IN <Unterabfrage>

Gibt es eine Möglichkeit (ohne JOIN), die WHERE-Klausel für 2 Spalten (OR) IN einer Unterabfrage zu verwenden? Derzeit mache ich das

WHERE 'col1' IN
(
    SELECT id FROM table
) OR 'col2' IN
(
    SELECT id FROM table
)

Und ich bin sicher, ich kann es besser machen :). Ich habe auch WHERE ('col1', 'col2') IN <subquery> versucht, aber MySQL sagt: Operand should contain 2 column(s)

Danke für Ihre Hilfe.

Edit: Mit "No join", ich meine, ich mache schon viele Joins: http://Pastebin.com/bRfD21W9 , und wie Sie sehen, befinden sich die Unterabfragen auf einer anderen Tabelle.

22
Max13

Ich habe gelesen, dass Sie nicht mit JOIN einverstanden sind, sondern nur eine andere Möglichkeit, dies zu tun. Sehen Sie join mit friends, ob es für Sie nützlich ist.

SELECT `timeline`.`action`, `timeline`.`data`, `timeline`.`tlupdate`,
            u1.`id` AS ufrom_id, u1.`username` AS ufrom_username, u1.`firstname` AS ufrom_firstname, u1.`lastname` AS ufrom_lastname, u1.`picture` AS ufrom_picture,
            u2.`id` AS uto_id, u2.`username` AS uto_username, u2.`firstname` AS uto_firstname, u2.`lastname` AS uto_lastname, u2.`picture` AS uto_picture,
            m.`id` AS m_id, m.`name` AS m_name, m.`alternative_name` AS m_altname, m.`tiny_img` AS m_tiny, m.`normal_img` AS m_normal
    FROM `timeline`
    JOIN `users` u1 ON u1.`id` = `timeline`.`user_id_from`
    JOIN `users` u2 ON u2.`id` = `timeline`.`user_id_to`
    JOIN `friends` f on f.`idol_id`=u1.`id` or f.`idol_id`=u2.`id`
    JOIN `movies` m ON m.`id` = `timeline`.`movie_id`;

Aktualisieren:

Da Sie inner join verwenden, können Sie dies auch tun, um die Bedingung für das vollständige ErgebnisSet zu vermeiden.

JOIN `friends` f on ((f.`idol_id`=u1.`id` or f.`idol_id`=u2.`id`) and f.idol_id = ?)

Sie können entweder DISTINCT oder GROUP BY verwenden, um ein eindeutiges Ergebnis zu erhalten.

3
manurajhada
SELECT *
FROM table

WHERE 
(col_1, col_2) NOT IN
 (SELECT col_1, col_2 FROM table)
24
Avinash Saini

Schreiben Sie Ihren Code so um, und Sie können loslegen:

WHERE ('col1', 'col2') IN
(
    SELECT id, id FROM table
)
3
Matin Kh

manurajhada Antwort ist gut. Wenn Sie sich trotzdem entscheiden, den JOIN zu vermeiden, könnten Sie:

SELECT ... FROM (SELECT id FROM table) subquery, other_table
WHERE other_table.col1 = subquery.id OR other_table.col2 = subquery.id

Dadurch sollte MySQL den Join-Puffer verwenden, um die Ergebnisse der Unterabfrage zu speichern.

2
MosheElisha

Ich habe auch ein ähnliches Problem 

SELECT COUNT(*) FROM msg_old WHERE idfrom IN 
    (SELECT olduserid FROM temp_user)
    OR
    idto IN (SELECT olduserid FROM temp_user)

Ich habe eine Lösung gefunden

SELECT * FROM msg_old 
INNER JOIN temp_user 
ON msg_old.IDFROM = temp_user.olduserid
OR msg_old.IDTO = temp_user.olduserid 
0
sameer.nuna

Sie können unter Abfrage versuchen:

select name from user_details where groupid IN ( select g_id from user_groups ) OR  cityid IN ( select c_id from user_cities );  

Ich hoffe das hilft.