Saya memiliki kunci majemuk unik seperti fr (fromid, toid) di tabel, ketika saya menjalankan kueri dengan menjelaskan saya mendapatkan hasil berikut:
Impossible WHERE noticed after reading const tables`
Kueri yang saya jalankan:
explain SELECT rid FROM relationship WHERE fromid=78 AND toid=60
Ada bantuan?
EDIT1:
Ketika saya menggunakan permintaan di bawah ini:
explain SELECT rid FROM relationship WHERE fromid=60 and toid=78 AND is_approved='s' OR is_approved='f' OR is_approved='t'
Saya melihat USING WHERE
bukannya pesan sebelumnya, tetapi ketika saya menggunakan kueri di bawah ini:
explain SELECT rid FROM relationship WHERE fromid=60 and toid=78 AND (is_approved='s' OR is_approved='f' OR is_approved='t')
Saya kembali mendapatkan impossible ...
pesan pertama ! Apa yang dilakukan kurung ini di sini?
EDIT2:
CREATE TABLE `relationship` (
`rid` int(10) unsigned NOT NULL AUTO_INCREMENT,
`fromid` mediumint(8) unsigned NOT NULL,
`toid` mediumint(8) unsigned NOT NULL,
`type` tinyint(3) unsigned NOT NULL,
`is_approved` char(1) NOT NULL,
PRIMARY KEY (`rid`),
UNIQUE KEY `fromid` (`fromid`,`toid`),
KEY `toid` (`toid`),
CONSTRAINT `relationship_ibfk_1` FOREIGN KEY (`fromid`) REFERENCES `user` (`uid`) ON DELETE CASCADE ON UPDATE CASCADE,
CONSTRAINT `relationship_ibfk_2` FOREIGN KEY (`toid`) REFERENCES `user` (`uid`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB
EDIT3:
Seperti yang dikatakan situs mysql:
Mustahil DI MANA memperhatikan setelah membaca tabel const
MySQL telah membaca semua tabel const (dan sistem) dan perhatikan bahwa klausa WHERE selalu salah.
Tetapi dalam kueri saya mendapatkan hasil yang saya inginkan, WHERE
bagiannya tidak false
. Apakah ada seseorang yang bisa menjelaskan hal ini dan menjelaskan masalah ini?
SELECT COUNT(1) FROM relationship WHERE fromid=78 AND toid=60;
kembali ???using index
tambahan bukanimpossible...
Jawaban:
Anda menerima pesannya
Ini didokumentasikan di halaman yang sudah Anda tautkan .
const
tabel didefinisikan sebagaiAnda punya
UNIQUE KEY
on(fromid,toid)
. Kueri aktifWHERE fromid=78 AND toid=60
dapat dipenuhi dengan membaca indeks unik ini. Dari pesan yang Anda dapatkan ini tidak boleh membuahkan hasil.Demikian pula, kueri
WHERE fromid=60 and toid=78 AND (is_approved='s' OR is_approved='f' OR is_approved='t')
juga dapat menggunakan indeks ini untuk menemukan baris yang diminati (meskipun masih memiliki predikat residual untuk dievaluasi jika ada baris yang cocok).Permintaan Anda yang lain berbeda
AND
memiliki prioritas lebih tinggi daripadaOr
, jadi ini sama denganIni tidak lagi dapat menggunakan indeks itu dan memiliki semantik yang berbeda dalam hal itu akan mengembalikan setiap baris di mana
is_approved IN ('f','t')
terlepas dari apa nilai-nilai di kolom lain.sumber
fromid=12 AND toid=78
kemudian memeriksa apakahis_approved='f'
atauis_approved='t'
atauis_approved='s'
WHERE fromid=60 AND toid=78 AND (is_approved='s' OR is_approved='f' OR is_approved='t')
yang juga dapat ditulis sebagai:WHERE fromid=60 AND toid=78 AND ( is_approved IN ('s', 'f', 't') )
fromid=60 AND toid=78
bagian sehingga tidak diperlukan pemeriksaan lebih lanjut (untukis_approved
bagian itu).(fromid,toid)
sehingga pasti akan ada satu maksimum? Dan dari pesan yang Anda katakan Anda mendapatkan MySQL tidak berpikir bahwa ada yang melakukannya. Apakah maksud Anda memiliki beberapa baris yang cocokfromid=60
dan beberapa baris yang cocoktoid=78
tetapi tidak harus baris yang sama?AND-OR
kebingungannya . Mungkin Anda ingin semua baris yang memilikifromid=60
dan semua baris yang memilikitoid=78
dan kemudian dari orang-orang, hanya menjaga mereka yang memiliki baik's'
atau'f'
ataut'
is_approved? Jika ya, coba kondisi ini:WHERE (fromid=60 OR toid=78) AND (is_approved IN ('s', 'f', 't'))
Jelaskan MySql menggunakan nilai yang Anda berikan, secara harfiah, untuk melintasi baris dari tabel terkait. Jika Anda memberikan nilai konstan / kunci yang tidak ada dalam tabel terkait, MySql Explain akan berhenti dengan kesalahan ini. Cukup kueri tabel terkait untuk nilai-nilai yang ada dan berikan pada kueri Jelaskan dan semuanya akan berfungsi seperti yang diharapkan.
sumber
Impossible WHERE noticed ...
bukan kesalahan. Itu bagian dari penjelasannya.Impossible WHERE noticed after reading const tables
di jelaskan kueri?Kesalahan ini terjadi karena nilai yang tidak valid diletakkan di kolom yang merupakan kunci utama atau kunci unik.
Coba dengan nilai yang benar dalam
where
klausa.sumber
Saya melompat ke selarut ini. Tapi inilah yang saya perhatikan untuk saya.
Saya melakukan kueri ini dan kolom item unik.
yang akan membuat Impossible WHERE diperhatikan setelah membaca tabel const
Yang harus saya lakukan adalah mengubah "=" menjadi "suka" dan sekarang menggunakan indeks saya.
sumber
=
?